/ Hex Artifact Content
Login

Artifact e6a7515b9c1d4a0f5baf88d12ab7476ec41c7352:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
0220: 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63 2c 76  * $Id: test1.c,v
0230: 20 31 2e 33 31 33 20 32 30 30 38 2f 30 37 2f 30   1.313 2008/07/0
0240: 38 20 30 33 3a 30 34 3a 35 39 20 73 68 61 6e 65  8 03:04:59 shane
0250: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0260: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0270: 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68  .#include "tcl.h
0280: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ".#include <stdl
0290: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
02a0: 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  string.h>../*.**
02b0: 20 54 68 69 73 20 69 73 20 61 20 63 6f 70 79 20   This is a copy 
02c0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 72  of the first par
02d0: 74 20 6f 66 20 74 68 65 20 53 71 6c 69 74 65 44  t of the SqliteD
02e0: 62 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 0a  b structure in .
02f0: 2a 2a 20 74 63 6c 73 71 6c 69 74 65 2e 63 2e 20  ** tclsqlite.c. 
0300: 20 57 65 20 6e 65 65 64 20 69 74 20 68 65 72 65   We need it here
0310: 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 65 74   so that the get
0320: 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 20  _sqlite_pointer 
0330: 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 6e 20 65  routine.** can e
0340: 78 74 72 61 63 74 20 74 68 65 20 73 71 6c 69 74  xtract the sqlit
0350: 65 33 2a 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  e3* pointer from
0360: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 54 63 6c   an existing Tcl
0370: 20 53 51 4c 69 74 65 0a 2a 2a 20 63 6f 6e 6e 65   SQLite.** conne
0380: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
0390: 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71   SqliteDb {.  sq
03a0: 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f  lite3 *db;.};../
03b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65 78  *.** Convert tex
03c0: 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  t generated by t
03d0: 68 65 20 22 25 70 22 20 63 6f 6e 76 65 72 73 69  he "%p" conversi
03e0: 6f 6e 20 66 6f 72 6d 61 74 20 62 61 63 6b 20 69  on format back i
03f0: 6e 74 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  nto.** a pointer
0400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0410: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 69 6e 74  testHexToInt(int
0420: 20 68 29 7b 0a 20 20 69 66 28 20 68 3e 3d 27 30   h){.  if( h>='0
0430: 27 20 26 26 20 68 3c 3d 27 39 27 20 29 7b 0a 20  ' && h<='9' ){. 
0440: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 30     return h - '0
0450: 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 68  ';.  }else if( h
0460: 3e 3d 27 61 27 20 26 26 20 68 3c 3d 27 66 27 20  >='a' && h<='f' 
0470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20  ){.    return h 
0480: 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 7d 65  - 'a' + 10;.  }e
0490: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
04a0: 20 68 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27 46   h>='A' && h<='F
04b0: 27 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' );.    return 
04c0: 68 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20  h - 'A' + 10;.  
04d0: 7d 0a 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  }.}.void *sqlite
04e0: 33 54 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74  3TextToPtr(const
04f0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69   char *z){.  voi
0500: 64 20 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20  d *p;.  u64 v;. 
0510: 20 75 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a   u32 v2;.  if( z
0520: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d  [0]=='0' && z[1]
0530: 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b  =='x' ){.    z +
0540: 3d 20 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30  = 2;.  }.  v = 0
0550: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
0560: 0a 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20  .    v = (v<<4) 
0570: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a  + testHexToInt(*
0580: 7a 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d  z);.    z++;.  }
0590: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29  .  if( sizeof(p)
05a0: 3d 3d 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20  ==sizeof(v) ){. 
05b0: 20 20 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76     memcpy(&p, &v
05c0: 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20  , sizeof(p));.  
05d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
05e0: 74 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69  t( sizeof(p)==si
05f0: 7a 65 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20  zeof(v2) );.    
0600: 76 32 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20  v2 = (u32)v;.   
0610: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c   memcpy(&p, &v2,
0620: 20 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d   sizeof(p));.  }
0630: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0640: 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d  ./*.** A TCL com
0650: 6d 61 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e  mand that return
0660: 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  s the address of
0670: 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69   the sqlite* poi
0680: 6e 74 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73  nter.** for an s
0690: 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  qlite connection
06a0: 20 69 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20   instance.  Bad 
06b0: 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66  things happen if
06c0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73   the.** input is
06d0: 20 6e 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63   not an sqlite c
06e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
06f0: 61 74 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c  atic int get_sql
0700: 69 74 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76  ite_pointer(.  v
0710: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
0720: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0730: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
0740: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
0750: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
0760: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0770: 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e   *p;.  Tcl_CmdIn
0780: 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68  fo cmdInfo;.  ch
0790: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
07a0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
07b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
07c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
07d0: 62 6a 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e  bjv, "SQLITE-CON
07e0: 4e 45 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72  NECTION");.    r
07f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0800: 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f  .  }.  if( !Tcl_
0810: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
0820: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
0830: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
0840: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
0850: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0860: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
0870: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a  d not found: ",.
0880: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
0890: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
08a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
08b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
08c0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73  OR;.  }.  p = (s
08d0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
08e0: 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
08f0: 74 44 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66  tData;.  sprintf
0900: 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e  (zBuf, "%p", p->
0910: 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63  db);.  if( strnc
0920: 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20  mp(zBuf,"0x",2) 
0930: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
0940: 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e  Buf, "0x%p", p->
0950: 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  db);.  }.  Tcl_A
0960: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0970: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
0980: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0990: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
09a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
09b0: 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a  qlite3 object..*
09c0: 2f 0a 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74  /.int getDbPoint
09d0: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  er(Tcl_Interp *i
09e0: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61  nterp, const cha
09f0: 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a  r *zA, sqlite3 *
0a00: 2a 70 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74  *ppDb){.  struct
0a10: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
0a20: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
0a30: 6e 66 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  nfo;.  if( Tcl_G
0a40: 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
0a50: 74 65 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e  terp, zA, &cmdIn
0a60: 66 6f 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  fo) ){.    p = (
0a70: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
0a80: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
0a90: 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44  ntData;.    *ppD
0aa0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c  b = p->db;.  }el
0ab0: 73 65 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20  se{.    *ppDb = 
0ac0: 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65  (sqlite3*)sqlite
0ad0: 33 54 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a  3TextToPtr(zA);.
0ae0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
0af0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 63  _OK;.}...const c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65 73 74  har *sqlite3Test
0b10: 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63  ErrorName(int rc
0b20: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
0b30: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77  *zName = 0;.  sw
0b40: 69 74 63 68 28 20 72 63 20 26 20 30 78 66 66 20  itch( rc & 0xff 
0b50: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
0b60: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a  TE_OK:         z
0b70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
0b80: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  K";          bre
0b90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0ba0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
0bb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0bc0: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 62 72  ERROR";       br
0bd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0be0: 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20  LITE_PERM:      
0bf0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0c00: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 62  _PERM";        b
0c10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0c20: 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20  QLITE_ABORT:    
0c30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0c40: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
0c50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0c60: 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20  SQLITE_BUSY:    
0c70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c80: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
0c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0ca0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
0cb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0cc0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
0cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0ce0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
0cf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0d00: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
0d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0d20: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
0d30: 4c 59 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  LY:   zName = "S
0d40: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
0d50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0d60: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
0d70: 52 55 50 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  RUPT:  zName = "
0d80: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
0d90: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
0da0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
0db0: 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  R:      zName = 
0dc0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20  "SQLITE_IOERR"; 
0dd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0de0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
0df0: 52 55 50 54 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  RUPT:    zName =
0e00: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
0e10: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
0e20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0e30: 4c 4c 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  LL:       zName 
0e40: 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b  = "SQLITE_FULL";
0e50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0e60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
0e70: 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65  ANTOPEN:   zName
0e80: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
0e90: 50 45 4e 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  PEN";    break;.
0ea0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0eb0: 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d  PROTOCOL:   zNam
0ec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54  e = "SQLITE_PROT
0ed0: 4f 43 4f 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  OCOL";    break;
0ee0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0ef0: 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 7a 4e 61  _EMPTY:      zNa
0f00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50  me = "SQLITE_EMP
0f10: 54 59 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TY";       break
0f20: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0f30: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e  E_SCHEMA:     zN
0f40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
0f50: 48 45 4d 41 22 3b 20 20 20 20 20 20 62 72 65 61  HEMA";      brea
0f60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0f70: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a  TE_CONSTRAINT: z
0f80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
0f90: 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 62 72 65  ONSTRAINT";  bre
0fa0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0fb0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
0fc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0fd0: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 62 72  MISMATCH";    br
0fe0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0ff0: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
1000: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
1010: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 62  _MISUSE";      b
1020: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1030: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
1040: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1050: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
1060: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1070: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
1080: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1090: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
10a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10b0: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
10c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
10d0: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
10e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10f0: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
1100: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
1110: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
1120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1130: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
1140: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
1150: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
1160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1170: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
1180: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1190: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
11a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
11c0: 44 42 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  DB:     zName = 
11d0: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
11e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
1200: 42 49 47 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  BIG:     zName =
1210: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
1220: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1230: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
1240: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
1250: 3d 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77  = "SQLITE_Unknow
1260: 6e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  n";     break;. 
1270: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
1280: 65 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 74 31 45  e;.}.#define t1E
1290: 72 72 6f 72 4e 61 6d 65 20 73 71 6c 69 74 65 33  rrorName sqlite3
12a0: 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 0a 0a 2f  TestErrorName../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
12c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e  sqlite3_stmt* in
12d0: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20  to an sqlite3*. 
12e0: 20 54 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   This depends on
12f0: 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61   the.** fact tha
1300: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69  t the sqlite3* i
1310: 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
1320: 64 20 69 6e 20 74 68 65 20 56 64 62 65 20 73 74  d in the Vdbe st
1330: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66  ructure..*/.#def
1340: 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20  ine StmtToDb(X) 
1350: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e    sqlite3_db_han
1360: 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68  dle(X)../*.** Ch
1370: 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c  eck a return val
1380: 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ue to make sure 
1390: 69 74 20 61 67 72 65 65 73 20 77 69 74 68 20 74  it agrees with t
13a0: 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72  he results.** fr
13b0: 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  om sqlite3_errco
13c0: 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
13d0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 54 63  e3TestErrCode(Tc
13e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13f0: 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1400: 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63  nt rc){.  if( rc
1410: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
1420: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
1430: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
1440: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
1450: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
1460: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
1470: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1480: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
1490: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
14a0: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
14b0: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
14c0: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
14d0: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
14e0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
14f0: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
1500: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
1510: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
1520: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1530: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1540: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
1550: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
1560: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1570: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
1580: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
1590: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
15a0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
15b0: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
15c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15d0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
15e0: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
15f0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
1600: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
1610: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
1620: 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 7a  lite3TextToPtr(z
1630: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Arg);.  return T
1640: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1650: 47 65 6e 65 72 61 74 65 20 61 20 74 65 78 74 20  Generate a text 
1660: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1670: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  f a pointer that
1680: 20 63 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f   can be understo
1690: 6f 64 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74  od.** by the get
16a0: 44 62 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65  DbPointer and ge
16b0: 74 56 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69  tVmPointer routi
16c0: 6e 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  nes above..**.**
16d0: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c   The problem is,
16e0: 20 6f 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65   on some machine
16f0: 73 20 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79  s (Solaris) if y
1700: 6f 75 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77  ou do a printf w
1710: 69 74 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20  ith.** "%p" you 
1720: 63 61 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75  cannot turn arou
1730: 6e 64 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e  nd and do a scan
1740: 66 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  f with the same 
1750: 22 25 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20  "%p" and.** get 
1760: 79 6f 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63  your pointer bac
1770: 6b 2e 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20  k.  You have to 
1780: 70 72 65 70 65 6e 64 20 61 20 22 30 78 22 20 62  prepend a "0x" b
1790: 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a  efore it will.**
17a0: 20 77 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65   work.  Or at le
17b0: 61 73 74 20 74 68 61 74 20 69 73 20 77 68 61 74  ast that is what
17c0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
17d0: 6d 65 20 28 64 72 68 29 2e 20 20 42 75 74 20 74  me (drh).  But t
17e0: 68 69 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20  his.** behavior 
17f0: 76 61 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68  varies from mach
1800: 69 6e 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20  ine to machine. 
1810: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73   The solution us
1820: 65 64 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20  ed her is.** to 
1830: 74 65 73 74 20 74 68 65 20 73 74 72 69 6e 67 20  test the string 
1840: 72 69 67 68 74 20 61 66 74 65 72 20 69 74 20 69  right after it i
1850: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  s generated to s
1860: 65 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a  ee if it can be.
1870: 2a 2a 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79  ** understood by
1880: 20 73 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e   scanf, and if n
1890: 6f 74 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69  ot, try prependi
18a0: 6e 67 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65  ng an "0x" to se
18b0: 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c  e if.** that hel
18c0: 70 73 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20  ps.  If nothing 
18d0: 77 6f 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65  works, a fatal e
18e0: 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65  rror is generate
18f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1900: 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1910: 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  Str(Tcl_Interp *
1920: 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50  interp, char *zP
1930: 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  tr, void *p){.  
1940: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1950: 28 31 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22  (100, zPtr, "%p"
1960: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , p);.  return T
1970: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1980: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  The callback rou
1990: 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33  tine for sqlite3
19a0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a  _exec_printf()..
19b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
19c0: 65 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69  ec_printf_cb(voi
19d0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67  d *pArg, int arg
19e0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  c, char **argv, 
19f0: 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20  char **name){.  
1a00: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72  Tcl_DString *str
1a10: 20 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a   = (Tcl_DString*
1a20: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
1a30: 0a 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69  .  if( Tcl_DStri
1a40: 6e 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30  ngLength(str)==0
1a50: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1a60: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
1a70: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
1a80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
1a90: 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d  r, name[i] ? nam
1aa0: 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  e[i] : "NULL");.
1ab0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1ac0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1ad0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ){.    Tcl_DStri
1ae0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
1af0: 73 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61  str, argv[i] ? a
1b00: 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  rgv[i] : "NULL")
1b10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49  ;.}../*.** The I
1b30: 2f 4f 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62  /O tracing callb
1b40: 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ack..*/.#if !def
1b50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b60: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
1b70: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1b80: 5f 49 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63  _IOTRACE).static
1b90: 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66   FILE *iotrace_f
1ba0: 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ile = 0;.static 
1bb0: 76 6f 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61  void io_trace_ca
1bc0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61  llback(const cha
1bd0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
1be0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
1bf0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1c00: 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69  Format);.  vfpri
1c10: 6e 74 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ntf(iotrace_file
1c20: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
1c30: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1c40: 66 66 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66  fflush(iotrace_f
1c50: 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ile);.}.#endif..
1c60: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f  /*.** Usage:  io
1c70: 5f 74 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a  _trace FILENAME.
1c80: 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74  **.** Turn I/O t
1c90: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
1ca0: 2e 20 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69  .  If FILENAME i
1cb0: 73 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73  s not an empty s
1cc0: 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72  tring,.** I/O tr
1cd0: 61 63 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69  acing begins goi
1ce0: 6e 67 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45  ng into FILENAME
1cf0: 2e 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73  . If FILENAME is
1d00: 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72   an empty.** str
1d10: 69 6e 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67  ing, I/O tracing
1d20: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a   is turned off..
1d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d40: 73 74 5f 69 6f 5f 74 72 61 63 65 28 0a 20 20 76  st_io_trace(.  v
1d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1e10: 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  */.){.#if !defin
1e20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1e30: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1e40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1e50: 4f 54 52 41 43 45 29 0a 20 20 69 66 28 20 61 72  OTRACE).  if( ar
1e60: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1e70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e80: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e90: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ea0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1eb0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
1ec0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
1ed0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ee0: 20 20 7d 0a 20 20 69 66 28 20 69 6f 74 72 61 63    }.  if( iotrac
1ef0: 65 5f 66 69 6c 65 20 29 7b 0a 20 20 20 20 69 66  e_file ){.    if
1f00: 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d  ( iotrace_file!=
1f10: 73 74 64 6f 75 74 20 26 26 20 69 6f 74 72 61 63  stdout && iotrac
1f20: 65 5f 66 69 6c 65 21 3d 73 74 64 65 72 72 20 29  e_file!=stderr )
1f30: 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  {.      fclose(i
1f40: 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 20 20  otrace_file);.  
1f50: 20 20 7d 0a 20 20 20 20 69 6f 74 72 61 63 65 5f    }.    iotrace_
1f60: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  file = 0;.    sq
1f70: 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
1f80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76  ;.  }.  if( argv
1f90: 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  [1][0] ){.    if
1fa0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
1fb0: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
1fc0: 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66  .      iotrace_f
1fd0: 69 6c 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ile = stdout;.  
1fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1ff0: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 65  mp(argv[1],"stde
2000: 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rr")==0 ){.     
2010: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2020: 73 74 64 65 72 72 3b 0a 20 20 20 20 7d 65 6c 73  stderr;.    }els
2030: 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  e{.      iotrace
2040: 5f 66 69 6c 65 20 3d 20 66 6f 70 65 6e 28 61 72  _file = fopen(ar
2050: 67 76 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20  gv[1], "w");.   
2060: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f   }.    sqlite3Io
2070: 54 72 61 63 65 20 3d 20 69 6f 5f 74 72 61 63 65  Trace = io_trace
2080: 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23  _callback;.  }.#
2090: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
20a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
20b0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20c0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
20d0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
20e0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
20f0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
2100: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
2110: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
2120: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
2130: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
2140: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
2150: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
2160: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
2170: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
2180: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
2190: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
21a0: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
21b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
21c0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
21d0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
21e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21f0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2200: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2210: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2220: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2230: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2240: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2250: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2260: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2280: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2290: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
22a0: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
22b0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
22c0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
22d0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
22e0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
22f0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
2300: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
2310: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2320: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2330: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2340: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2350: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
2360: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
2370: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2390: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23a0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
23b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23c0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
23d0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
23e0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
23f0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
2400: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
2410: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2420: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2430: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2440: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2450: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2460: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2470: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2480: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2490: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
24a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
24b0: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
24c0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
24d0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
24e0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
24f0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
2500: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
2510: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2520: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2530: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2540: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2550: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2560: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2570: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f  *.** Usage:  db_
2580: 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20  enter DB.**     
2590: 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a      db_leave DB.
25a0: 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c  **.** Enter or l
25b0: 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f  eave the mutex o
25c0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  n a database con
25d0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
25e0: 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72 28  ic int db_enter(
25f0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2600: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2610: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2620: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2630: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2640: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2650: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2660: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2670: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2680: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
26a0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
26b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
26c0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
26d0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
26e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
26f0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2700: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2710: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2720: 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
2730: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2740: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2750: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2760: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2770: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2780: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
2790: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
27a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
27b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61  rn TCL_OK;.}.sta
27c0: 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76 65  tic int db_leave
27d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
27e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
27f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2800: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2810: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2820: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2830: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2850: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2860: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2880: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2890: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
28a0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
28b0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
28c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
28d0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
28e0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
28f0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2900: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2920: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2930: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2940: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2950: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
2970: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
2980: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
2990: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
29a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
29b0: 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20 53  ite3_exec  DB  S
29c0: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
29d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
29e0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
29f0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2a00: 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  se DB.*/.static 
2a10: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a 20  int test_exec(. 
2a20: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2a30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a40: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2a50: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a60: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a70: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a80: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2a90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2aa0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2ab0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2ad0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2ae0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2af0: 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74  3 *db;.  Tcl_DSt
2b00: 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20  ring str;.  int 
2b10: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
2b20: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
2b30: 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ql;.  int i, j;.
2b40: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
2b50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
2b60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2b70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2b80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2b90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
2ba0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
2bb0: 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
2bc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bd0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2be0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2bf0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2c00: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2c10: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
2c20: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
2c30: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2c40: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67 76  rintf("%s", argv
2c50: 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  [2]);.  for(i=j=
2c60: 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20  0; zSql[i];){.  
2c70: 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27    if( zSql[i]=='
2c80: 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  %' ){.      zSql
2c90: 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65 78  [j++] = (testHex
2ca0: 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29  ToInt(zSql[i+1])
2cb0: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
2cc0: 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a  Int(zSql[i+2]);.
2cd0: 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20        i += 3;.  
2ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
2cf0: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b  Sql[j++] = zSql[
2d00: 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i++];.    }.  }.
2d10: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
2d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2d30: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2d40: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2d50: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  r, &zErr);.  sql
2d60: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2d70: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
2d80: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2d90: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2da0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
2db0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2dc0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53  nt(interp, rc==S
2dd0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44  QLITE_OK ? Tcl_D
2de0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
2df0: 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c  ) : zErr);.  Tcl
2e00: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
2e10: 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  r);.  if( zErr )
2e20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2e30: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
2e40: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
2e50: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
2e60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e70: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2e80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2e90: 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  e:  sqlite3_exec
2ea0: 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  _nr  DB  SQL.**.
2eb0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2ec0: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ed0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2ee0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e  pen database DB.
2ef0: 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c    Discard.** all
2f00: 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74   results.*/.stat
2f10: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
2f20: 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  _nr(.  void *Not
2f30: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2f40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2f50: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2f60: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2f70: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2f80: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2fa0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2fb0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2fc0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2fd0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2fe0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2ff0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
3000: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3010: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  Err = 0;.  if( a
3020: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
3030: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3040: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3050: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3060: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3070: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
3080: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
3090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
30a0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
30b0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
30c0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
30d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
30e0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
30f0: 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20  db, argv[2], 0, 
3100: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28  0, &zErr);.  if(
3110: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
3120: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
3130: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
3140: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
3150: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3160: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
3170: 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
3180: 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52 47    SEPARATOR  ARG
3190: 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a  0  ARG1 ....**.*
31a0: 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66 6f  * Test the %z fo
31b0: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 4d 50  rmat of sqliteMP
31c0: 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75  rintf().  Use mu
31d0: 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29  ltiple mprintf()
31e0: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f   calls to .** co
31f0: 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30 20 74  ncatenate arg0 t
3200: 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e  hrough argn usin
3210: 67 20 73 65 70 61 72 61 74 6f 72 20 61 73 20 74  g separator as t
3220: 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a  he separator..**
3230: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
3240: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
3250: 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  t test_mprintf_z
3260: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3270: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3280: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3290: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
32a0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
32b0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
32c0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
32e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3310: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3320: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
3330: 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a  r *zResult = 0;.
3340: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
3350: 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26 20 28  i=2; i<argc && (
3360: 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c 74 29  i==2 || zResult)
3370: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73  ; i++){.    zRes
3380: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ult = sqlite3MPr
3390: 69 6e 74 66 28 30 2c 20 22 25 7a 25 73 25 73 22  intf(0, "%z%s%s"
33a0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
33b0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
33c0: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
33d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
33e0: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
33f0: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3400: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3410: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3420: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3430: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3440: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3450: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
3460: 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28 29 2e  sqliteMPrintf().
3470: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e    Return the len
3480: 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  gth of the.** in
3490: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  put string..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
34b0: 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69 64  printf_n(.  void
34c0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
34d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
34e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
34f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3500: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3510: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3520: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3530: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3540: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3550: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3560: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3570: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
3580: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72 3b  ){.  char *zStr;
3590: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
35a0: 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zStr = sqlite3MP
35b0: 72 69 6e 74 66 28 30 2c 20 22 25 73 25 6e 22 2c  rintf(0, "%s%n",
35c0: 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20   argv[1], &n);. 
35d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
35e0: 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  tr);.  Tcl_SetOb
35f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
3600: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29  Tcl_NewIntObj(n)
3610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3620: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3630: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
3640: 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20  rintf_int  SIZE 
3650: 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a  FORMAT  INT.**.*
3660: 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71  * Test the of sq
3670: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29  lite3_snprintf()
3680: 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20   routine.  SIZE 
3690: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
36a0: 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
36b0: 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54  fer in bytes.  T
36c0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
36d0: 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20  is 100.  FORMAT 
36e0: 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74  is the.** format
36f0: 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73   string.  INT is
3700: 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65   a single intege
3710: 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  r argument.  The
3720: 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e   FORMAT.** strin
3730: 67 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e  g must require n
3740: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73  o more than this
3750: 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67   one integer arg
3760: 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f  ument.  If.** Yo
3770: 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d  u pass in a form
3780: 61 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72  at string that r
3790: 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61  equires more tha
37a0: 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a  n one argument,.
37b0: 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69  ** bad things wi
37c0: 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74  ll happen..*/.st
37d0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e  atic int test_sn
37e0: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
37f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3800: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3810: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3820: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3830: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3840: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3850: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3860: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3870: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3880: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3890: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
38a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
38b0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72  /.){.  char zStr
38c0: 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d  [100];.  int n =
38d0: 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a   atoi(argv[1]);.
38e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
38f0: 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b  ormat = argv[2];
3900: 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69  .  int a1 = atoi
3910: 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (argv[3]);.  if(
3920: 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20   n>sizeof(zStr) 
3930: 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74  ) n = sizeof(zSt
3940: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  r);.  sqlite3_sn
3950: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
3960: 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64  tr), zStr, "abcd
3970: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
3980: 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69  uvwxyz");.  sqli
3990: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
39a0: 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  zStr, zFormat, a
39b0: 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  1);.  Tcl_Append
39c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
39d0: 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Str, 0);.  retur
39e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
39f0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3a00: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
3a10: 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20  ntf  DB  FORMAT 
3a20: 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63   STRING  ?--no-c
3a30: 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76  ounts?.**.** Inv
3a40: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
3a50: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3a60: 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69  () interface usi
3a70: 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ng the open data
3a80: 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65  base.** DB.  The
3a90: 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69   SQL is the stri
3aa0: 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20  ng FORMAT.  The 
3ab0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68  format string sh
3ac0: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
3ad0: 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53  one %s or %q.  S
3ae0: 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c  TRING is the val
3af0: 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ue inserted into
3b00: 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74   %s or %q..*/.st
3b10: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65  atic int test_ge
3b20: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a  t_table_printf(.
3b30: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3b40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3b50: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3b60: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3b70: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3b80: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3b90: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3ba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3bb0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3bc0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3be0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3bf0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3c00: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
3c10: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
3c20: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
3c30: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f  r = 0;.  int nRo
3c40: 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  w, nCol;.  char 
3c50: 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  **aResult;.  int
3c60: 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   i;.  char zBuf[
3c70: 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  30];.  char *zSq
3c80: 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e  l;.  int resCoun
3c90: 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72  t = -1;.  if( ar
3ca0: 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  gc==5 ){.    if(
3cb0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
3cc0: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65  rp, argv[4], &re
3cd0: 73 43 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e  sCount) ) return
3ce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3cf0: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 26 26    if( argc!=4 &&
3d00: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
3d10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3d20: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3d30: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3d40: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
3d50: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52  .       " DB FOR
3d60: 4d 41 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e  MAT STRING ?COUN
3d70: 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T?", 0);.    ret
3d80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3d90: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
3da0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
3db0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
3dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3dd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
3de0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
3df0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3e00: 66 28 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33  f(argv[2],argv[3
3e10: 5d 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  ]);.  if( argc==
3e20: 35 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  5 ){.    rc = sq
3e30: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
3e40: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
3e50: 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  lt, 0, 0, &zErr)
3e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3e70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  c = sqlite3_get_
3e80: 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20  table(db, zSql, 
3e90: 26 61 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c  &aResult, &nRow,
3ea0: 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a   &nCol, &zErr);.
3eb0: 20 20 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28      resCount = (
3ec0: 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20  nRow+1)*nCol;.  
3ed0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
3ee0: 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74  (zSql);.  sprint
3ef0: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  f(zBuf, "%d", rc
3f00: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
3f10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
3f20: 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
3f30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3f40: 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a   if( argc==4 ){.
3f50: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
3f60: 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b  uf, "%d", nRow);
3f70: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
3f80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3f90: 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70   zBuf);.      sp
3fa0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
3fb0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54  , nCol);.      T
3fc0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
3fd0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
3fe0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
3ff0: 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69  0; i<resCount; i
4000: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
4010: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4020: 65 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20  erp, aResult[i] 
4030: 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22  ? aResult[i] : "
4040: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20  NULL");.    }.  
4050: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
4060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4070: 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  erp, zErr);.  }.
4080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
4090: 61 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20  able(aResult);. 
40a0: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
40b0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
40c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
40d0: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
40e0: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
40f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
4100: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4110: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
4120: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
4130: 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a 2a 0a  ert_rowid DB.**.
4140: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 69  ** Returns the i
4150: 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f 66 20  nteger ROWID of 
4160: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
4170: 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61 74 69  insert..*/.stati
4180: 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73 74 5f  c int test_last_
4190: 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a 4e  rowid(.  void *N
41a0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
41b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
41c0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
41d0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
41e0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
41f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4210: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4220: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4230: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4240: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
4250: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4260: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4270: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
4280: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4290: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
42a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
42b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
42c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
42d0: 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20 30  v[0], " DB\"", 0
42e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
42f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4300: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4310: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4320: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4330: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69  CL_ERROR;.  spri
4340: 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c 64 22  ntf(zBuf, "%lld"
4350: 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  , sqlite3_last_i
4360: 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29  nsert_rowid(db))
4370: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
4380: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
4390: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
43a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
43b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
43c0: 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59 0a 2a  te3_key DB KEY.*
43d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
43e0: 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  ec key..*/.stati
43f0: 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79 28 0a  c int test_key(.
4400: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
4410: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4420: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
4430: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
4440: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
4450: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
4460: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
4470: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4480: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4490: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
44b0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
44c0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
44d0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
44e0: 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e  char *zKey;.  in
44f0: 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72  t nKey;.  if( ar
4500: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
4510: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4520: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4530: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4540: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4550: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4560: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4570: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4580: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4590: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
45a0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
45b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
45c0: 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zKey = argv[2];.
45d0: 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28    nKey = strlen(
45e0: 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  zKey);.#ifdef SQ
45f0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
4600: 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64 62 2c   sqlite3_key(db,
4610: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
4620: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
4630: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4640: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
4650: 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a  ekey DB KEY.**.*
4660: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 64  * Change the cod
4670: 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  ec key..*/.stati
4680: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b 65 79  c int test_rekey
4690: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
46a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
46b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
46c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
46d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
46e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
46f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4700: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4710: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4720: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4740: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4750: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4760: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
4770: 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20  t char *zKey;.  
4780: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20  int nKey;.  if( 
4790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
47a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
47b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
47c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
47d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
47e0: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
47f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4810: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
4820: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
4830: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
4840: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4850: 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d    zKey = argv[2]
4860: 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65  ;.  nKey = strle
4870: 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66 20  n(zKey);.#ifdef 
4880: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
4890: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  .  sqlite3_rekey
48a0: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
48b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
48c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
48d0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
48e0: 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a  e3_close DB.**.*
48f0: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4900: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4910: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4920: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4930: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4940: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4950: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4960: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4970: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4980: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4990: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
49a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
49b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
49c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
49d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
49e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
49f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4a00: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4a10: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4a20: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4a30: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4a50: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4a60: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4a70: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4a80: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4a90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4aa0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ab0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ac0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4ad0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4ae0: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4af0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4b00: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4b10: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4b20: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4b30: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4b40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
4b60: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
4b70: 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63  _coalesce() func
4b80: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
4b90: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4ba0: 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  nt non-NULL argu
4bb0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
4bc0: 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75  void t1_ifnullFu
4bd0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
4be0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
4bf0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
4c00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4c10: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
4c20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4c30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4c40: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
4c50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
4c60: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
4c70: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
4c80: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
4c90: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71  gv[i]);.      sq
4ca0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4cb0: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
4cc0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
4cd0: 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20  text(argv[i]),. 
4ce0: 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c 49           n, SQLI
4cf0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
4d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d10: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
4d20: 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66 75  hese are test fu
4d30: 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78 38  nctions.    hex8
4d40: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
4d50: 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a  s argument as.**
4d60: 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72 6e   UTF8 and return
4d70: 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67  s a hex encoding
4d80: 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e 74  .  hex16le() int
4d90: 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67 75  erprets its argu
4da0: 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31 36  ment.** as UTF16
4db0: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  le and returns a
4dc0: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a   hex encoding..*
4dd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
4de0: 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  x8Func(sqlite3_c
4df0: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61  ontext *p, int a
4e00: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
4e10: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ue **argv){.  co
4e20: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4e30: 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  r *z;.  int i;. 
4e40: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
4e50: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
4e60: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
4e70: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
4e80: 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20  <sizeof(zBuf)/2 
4e90: 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  - 2 && z[i]; i++
4ea0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ){.    sprintf(&
4eb0: 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32 78  zBuf[i*2], "%02x
4ec0: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
4ed0: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d   }.  zBuf[i*2] =
4ee0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
4ef0: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
4f00: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
4f10: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4f20: 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
4f30: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61  E_OMIT_UTF16.sta
4f40: 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46 75  tic void hex16Fu
4f50: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
4f60: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
4f70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4f80: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
4f90: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
4fa0: 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt *z;.  int i;.
4fb0: 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d    char zBuf[400]
4fc0: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
4fd0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
4fe0: 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[0]);.  for(i=0
4ff0: 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29  ; i<sizeof(zBuf)
5000: 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20  /4 - 4 && z[i]; 
5010: 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  i++){.    sprint
5020: 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22 25  f(&zBuf[i*4], "%
5030: 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29  04x", z[i]&0xff)
5040: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34  ;.  }.  zBuf[i*4
5050: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
5060: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
5070: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
5080: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5090: 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  T);.}.#endif../*
50a0: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
50b0: 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61 63  into which to ac
50c0: 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a  cumulate text..*
50d0: 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b 0a  /.struct dstr {.
50e0: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f    int nAlloc;  /
50f0: 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
5100: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64  d */.  int nUsed
5110: 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65  ;   /* Space use
5120: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  d */.  char *z; 
5130: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63 65      /* The space
5140: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70   */.};../*.** Ap
5150: 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64  pend text to a d
5160: 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  str.*/.static vo
5170: 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73 74  id dstrAppend(st
5180: 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63 6f  ruct dstr *p, co
5190: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
51a0: 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e 74   divider){.  int
51b0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
51c0: 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b    if( p->nUsed +
51d0: 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c   n + 2 > p->nAll
51e0: 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  oc ){.    char *
51f0: 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c  zNew;.    p->nAl
5200: 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a  loc = p->nAlloc*
5210: 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20  2 + n + 200;.   
5220: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   zNew = sqlite3_
5230: 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d  realloc(p->z, p-
5240: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
5250: 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( zNew==0 ){.   
5260: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5270: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p->z);.      mem
5280: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
5290: 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (*p));.      ret
52a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
52b0: 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a  ->z = zNew;.  }.
52c0: 20 20 69 66 28 20 64 69 76 69 64 65 72 20 26 26    if( divider &&
52d0: 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20   p->nUsed>0 ){. 
52e0: 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64     p->z[p->nUsed
52f0: 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a 20  ++] = divider;. 
5300: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e   }.  memcpy(&p->
5310: 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20  z[p->nUsed], z, 
5320: 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64  n+1);.  p->nUsed
5330: 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   += n;.}../*.** 
5340: 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63 68  Invoked for each
5350: 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73   callback from s
5360: 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a 2a  qlite3ExecFunc.*
5370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65  /.static int exe
5380: 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f  cFuncCallback(vo
5390: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61  id *pData, int a
53a0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
53b0: 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64  , char **NotUsed
53c0: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
53d0: 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64 73   *p = (struct ds
53e0: 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e 74  tr*)pData;.  int
53f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5400: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
5410: 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20   if( argv[i]==0 
5420: 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70  ){.      dstrApp
5430: 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27  end(p, "NULL", '
5440: 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ');.    }else{.
5450: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
5460: 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20 27  (p, argv[i], ' '
5470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5480: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5490: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
54a0: 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74 65   of the x_sqlite
54b0: 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f 6e  _exec() function
54c0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
54d0: 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67   takes.** a sing
54e0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  le argument and 
54f0: 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65 63  attempts to exec
5500: 75 74 65 20 74 68 61 74 20 61 72 67 75 6d 65 6e  ute that argumen
5510: 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a  t as SQL code..*
5520: 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67 61  * This is illega
5530: 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65 74  l and should set
5540: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
5550: 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 64  SE flag on the d
5560: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32  atabase..**.** 2
5570: 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20  004-Jan-07:  We 
5580: 68 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 69  have changed thi
5590: 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67  s to make it leg
55a0: 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
55b0: 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f  e3_exec().** fro
55c0: 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63 74  m within a funct
55d0: 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a  ion call.  .** .
55e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
55f0: 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65 66  simulates the ef
5600: 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20 74  fect of having t
5610: 77 6f 20 74 68 72 65 61 64 73 20 61 74 74 65 6d  wo threads attem
5620: 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65  pt to.** use the
5630: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61   same database a
5640: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5660: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 28  sqlite3ExecFunc(
5670: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5680: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
5690: 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71  int argc,  .  sq
56a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
56b0: 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 64  gv.){.  struct d
56c0: 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28  str x;.  memset(
56d0: 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
56e0: 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  );.  (void)sqlit
56f0: 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65 33  e3_exec((sqlite3
5700: 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
5710: 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20  ata(context),.  
5720: 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
5730: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5740: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78  gv[0]),.      ex
5750: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20  ecFuncCallback, 
5760: 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  &x, 0);.  sqlite
5770: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5780: 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55  ntext, x.z, x.nU
5790: 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sed, SQLITE_TRAN
57a0: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
57b0: 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a  3_free(x.z);.}..
57c0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
57d0: 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31 33 66  tion of tkt2213f
57e0: 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61 72 20  unc(), a scalar 
57f0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74 61  function that ta
5800: 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f  kes exactly.** o
5810: 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  ne argument. It 
5820: 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65 73 74  has two interest
5830: 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a  ing features:.**
5840: 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73 20 73  .** * It calls s
5850: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5860: 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e 20 74  t() 3 times on t
5870: 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71 6c 69  he argument sqli
5880: 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20  te3_value*..**  
5890: 20 49 66 20 74 68 65 20 74 68 72 65 65 20 70 6f   If the three po
58a0: 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20  inters returned 
58b0: 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65  are not the same
58c0: 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20 69 73   an SQL error is
58d0: 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   raised..**.** *
58e0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 72 65   Otherwise it re
58f0: 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20  turns a copy of 
5900: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
5910: 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a  ntation of its .
5920: 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 69 6e  **   argument in
5930: 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
5940: 68 65 20 56 44 42 45 20 72 65 70 72 65 73 65 6e  he VDBE represen
5950: 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a  tation is a Mem*
5960: 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68   cell .**   with
5970: 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c   the MEM_Term fl
5980: 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a  ag clear. .**.**
5990: 20 54 69 63 6b 65 74 20 23 32 32 31 33 20 63 61   Ticket #2213 ca
59a0: 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74  n therefore be t
59b0: 65 73 74 65 64 20 62 79 20 65 76 61 6c 75 61 74  ested by evaluat
59c0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
59d0: 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  g.** SQL express
59e0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74  ion:.**.**   tkt
59f0: 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32 31 33  2213func(tkt2213
5a00: 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67 27 29  func('a string')
5a10: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  );.*/.static voi
5a20: 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f  d tkt2213Functio
5a30: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
5a40: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5a50: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5a60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5a70: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54  argv.){.  int nT
5a80: 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ext;.  unsigned 
5a90: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
5aa0: 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t1;.  unsigned c
5ab0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
5ac0: 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  2;.  unsigned ch
5ad0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33  ar const *zText3
5ae0: 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73 71 6c  ;..  nText = sql
5af0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5b00: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65  (argv[0]);.  zTe
5b10: 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  xt1 = sqlite3_va
5b20: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5b30: 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20 73 71  );.  zText2 = sq
5b40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5b50: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65  (argv[0]);.  zTe
5b60: 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  xt3 = sqlite3_va
5b70: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5b80: 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 31  );..  if( zText1
5b90: 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65 78  !=zText2 || zTex
5ba0: 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20  t2!=zText3 ){.  
5bb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5bc0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
5bd0: 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f 74 20  "tkt2213 is not 
5be0: 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d  fixed", -1);.  }
5bf0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
5c00: 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29  zCopy = (char *)
5c10: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
5c20: 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Text);.    memcp
5c30: 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c  y(zCopy, zText1,
5c40: 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73 71 6c   nText);.    sql
5c50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5c60: 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c  (context, zCopy,
5c70: 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65 33 5f   nText, sqlite3_
5c80: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  free);.  }.}../*
5c90: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
5ca0: 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  g SQL function t
5cb0: 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e 74 73  akes 4 arguments
5cc0: 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a  .  The 2nd and.*
5cd0: 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6d  * 4th argument m
5ce0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  ust be one of th
5cf0: 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20 27 74  ese strings:  't
5d00: 65 78 74 27 2c 20 27 74 65 78 74 31 36 27 2c 0a  ext', 'text16',.
5d10: 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72  ** or 'blob' cor
5d20: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50  responding to AP
5d30: 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a  I functions.**.*
5d40: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
5d50: 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20  alue_text().**  
5d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5d70: 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20 20 20  e_text16().**   
5d80: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5d90: 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68  _blob().**.** Th
5da0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
5db0: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 65 69   is a string, ei
5dc0: 74 68 65 72 20 27 62 79 74 65 73 27 20 6f 72 20  ther 'bytes' or 
5dd0: 27 62 79 74 65 73 31 36 27 20 6f 72 20 27 6e 6f  'bytes16' or 'no
5de0: 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  op',.** correspo
5df0: 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a  nding to APIs:.*
5e00: 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
5e10: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 29 0a  3_value_bytes().
5e20: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
5e30: 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 29 0a  value_bytes16().
5e40: 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a  **      noop.**.
5e50: 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65 73 69  ** The APIs desi
5e60: 67 6e 61 74 65 64 20 62 79 20 74 68 65 20 32 6e  gnated by the 2n
5e70: 64 20 74 68 72 6f 75 67 68 20 34 74 68 20 61 72  d through 4th ar
5e80: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 6c  guments are appl
5e90: 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ied.** to the fi
5ea0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 6e 20  rst argument in 
5eb0: 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65 20 70  order.  If the p
5ec0: 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64  ointers returned
5ed0: 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   by the.** secon
5ee0: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72 65  d and fourth are
5ef0: 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73   different, this
5f00: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5f10: 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a   1.  Otherwise,.
5f20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5f30: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a  returns 0..**.**
5f40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5f50: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
5f60: 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74 75 72  o see when retur
5f70: 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66 72 6f  ned pointers fro
5f80: 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74 28 29  m.** the _text()
5f90: 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e 64 20  , _text16() and 
5fa0: 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62 65 63  _blob() APIs bec
5fb0: 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  ome invalidated.
5fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5fd0: 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28  ptrChngFunction(
5fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5ff0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
6000: 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71  int argc,  .  sq
6010: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6020: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  gv.){.  const vo
6030: 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63  id *p1, *p2;.  c
6040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b  onst char *zCmd;
6050: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29  .  if( argc!=4 )
6060: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20   return;.  zCmd 
6070: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
6080: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6090: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
60a0: 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75  ( zCmd==0 ) retu
60b0: 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  rn;.  if( strcmp
60c0: 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30  (zCmd,"text")==0
60d0: 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f   ){.    p1 = (co
60e0: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
60f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6100: 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  v[0]);.#ifndef S
6110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
6120: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6130: 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31  cmp(zCmd, "text1
6140: 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  6")==0 ){.    p1
6150: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6160: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6170: 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23  xt16(argv[0]);.#
6180: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66  endif.  }else if
6190: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
61a0: 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20  blob")==0 ){.   
61b0: 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p1 = (const voi
61c0: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
61d0: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
61e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
61f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  urn;.  }.  zCmd 
6200: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
6210: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6220: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66  t(argv[2]);.  if
6230: 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75  ( zCmd==0 ) retu
6240: 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  rn;.  if( strcmp
6250: 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d  (zCmd,"bytes")==
6260: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6270: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
6280: 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  v[0]);.#ifndef S
6290: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
62a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
62b0: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74 65 73  cmp(zCmd, "bytes
62c0: 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  16")==0 ){.    s
62d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
62e0: 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23  es16(argv[0]);.#
62f0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66  endif.  }else if
6300: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
6310: 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  noop")==0 ){.   
6320: 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* do nothing *
6330: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  /.  }else{.    r
6340: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6350: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6360: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6370: 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20  ext(argv[3]);.  
6380: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6390: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
63a0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
63b0: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28  =0 ){.    p2 = (
63c0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
63d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
63e0: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
63f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6400: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6410: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6420: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6430: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
6440: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6450: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6460: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6470: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6480: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
6490: 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76     p2 = (const v
64a0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
64b0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
64c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
64d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
64e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
64f0: 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70 32 29  context, p1!=p2)
6500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
6510: 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74 5f  e:  sqlite_test_
6520: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6530: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6540: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6550: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6560: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6570: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6580: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6590: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
65a0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
65b0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
65c0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
65d0: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
65e0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
65f0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6600: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6610: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6620: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6630: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6640: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6650: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6660: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6670: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6680: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6690: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
66a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
66b0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
66c0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
66d0: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
66e0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
66f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6700: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6710: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6730: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6740: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6750: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6760: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6770: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6780: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6790: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
67a0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
67b0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
67c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
67d0: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
67e0: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
67f0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6800: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6810: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6820: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6830: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6840: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6850: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6860: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6880: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6890: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
68a0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
68b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
68c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
68d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
68e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 65 78 74 65  ite3 *db;.  exte
68f0: 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69  rn void Md5_Regi
6900: 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a  ster(sqlite3*);.
6910: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
6920: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
6930: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6940: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
6950: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
6960: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44  v[0],.       " D
6970: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
6980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6990: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
69a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
69b0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
69c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
69d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
69e0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
69f0: 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22  db, "x_coalesce"
6a00: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  , -1, SQLITE_ANY
6a10: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
6a20: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
6a30: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
6a40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6a60: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
6a70: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
6a80: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
6a90: 20 20 20 20 20 68 65 78 38 46 75 6e 63 2c 20 30       hex8Func, 0
6aa0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  , 0);.  }.#ifnde
6ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
6ac0: 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  F16.  if( rc==SQ
6ad0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6ae0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6af0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
6b00: 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51 4c 49  "hex16", 1, SQLI
6b10: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
6b20: 20 20 20 20 20 20 68 65 78 31 36 46 75 6e 63 2c        hex16Func,
6b30: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
6b40: 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  if.  if( rc==SQL
6b50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6b60: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6b70: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6b80: 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c  tkt2213func", 1,
6b90: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32  .          tkt22
6bb0: 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  13Function, 0, 0
6bc0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6bd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
6bf0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
6c00: 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e  b, "pointer_chan
6c10: 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  ge", 4, SQLITE_A
6c20: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
6c30: 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f    ptrChngFunctio
6c40: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23  n, 0, 0);.  }..#
6c50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6c60: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55 73  IT_UTF16.  /* Us
6c70: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72  e the sqlite3_cr
6c80: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
6c90: 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e  ) API here. Main
6ca0: 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20  ly for fun, but 
6cb0: 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75  also .  ** becau
6cc0: 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73  se it is not tes
6cd0: 74 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73  ted anywhere els
6ce0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
6cf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6d00: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74   const void *zUt
6d10: 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  f16;.    sqlite3
6d20: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
6d30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6d40: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
6d50: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
6d60: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
6d70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
6d80: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
6d90: 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65  1, "x_sqlite_exe
6da0: 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  c", SQLITE_UTF8,
6db0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6dc0: 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71  .    zUtf16 = sq
6dd0: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
6de0: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Val, SQLITE_UTF1
6df0: 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66  6NATIVE);.    if
6e00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
6e10: 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
6e20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6e30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6e40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
6e50: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64  ate_function16(d
6e60: 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20 20  b, zUtf16, .    
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53              1, S
6e80: 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62 2c  QLITE_UTF16, db,
6e90: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
6ea0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
6eb0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
6ec0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73  ree(pVal);.    s
6ed0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6ee0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6ef0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
6f00: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
6f10: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
6f20: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
6f30: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
6f40: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
6f50: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
6f60: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
6f70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
6f80: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
6f90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
6fa0: 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72 65   x_count() aggre
6fb0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
6fc0: 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63  *.** x_count() c
6fd0: 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72  ounts the number
6fe0: 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67   of non-null arg
6ff0: 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68 65  uments.  But the
7000: 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74  re are.** some t
7010: 77 69 73 74 73 20 66 6f 72 20 74 65 73 74 69 6e  wists for testin
7020: 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a  g purposes..**.*
7030: 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e  * If the argumen
7040: 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69  t to x_count() i
7050: 73 20 34 30 20 74 68 65 6e 20 61 20 55 54 46 2d  s 40 then a UTF-
7060: 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72  8 error is repor
7070: 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  ted.** on the st
7080: 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66  ep function.  If
7090: 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73 20   x_count(41) is 
70a0: 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54 46  seen, then a UTF
70b0: 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20  -16 error.** is 
70c0: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
70d0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
70e0: 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75  If the total cou
70f0: 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a  nt is 42, then.*
7100: 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20  * a UTF-8 error 
7110: 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74  is reported on t
7120: 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63  he finalize func
7130: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
7140: 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43   struct t1CountC
7150: 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73  tx t1CountCtx;.s
7160: 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78  truct t1CountCtx
7170: 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73   {.  int n;.};.s
7180: 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75  tatic void t1Cou
7190: 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  ntStep(.  sqlite
71a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
71b0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
71c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
71d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f  **argv.){.  t1Co
71e0: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
71f0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
7200: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
7210: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
7220: 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20  .  if( (argc==0 
7230: 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  || SQLITE_NULL!=
7240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
7250: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26 26  pe(argv[0]) ) &&
7260: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b   p ){.    p->n++
7270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  ;.  }.  if( argc
7280: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20  >0 ){.    int v 
7290: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
72a0: 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  int(argv[0]);.  
72b0: 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20    if( v==40 ){. 
72c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
72d0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
72e0: 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30 20  t, "value of 40 
72f0: 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e  handed to x_coun
7300: 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66  t", -1);.#ifndef
7310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
7320: 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  16.    }else if(
7330: 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20 20   v==41 ){.      
7340: 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66 31  const char zUtf1
7350: 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c  6ErrMsg[] = { 0,
7360: 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c 20   0x61, 0, 0x62, 
7370: 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20 30  0, 0x63, 0, 0, 0
7380: 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  };.      sqlite3
7390: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 28  _result_error16(
73a0: 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31 36  context, &zUtf16
73b0: 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f  ErrMsg[1-SQLITE_
73c0: 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b  BIGENDIAN], -1);
73d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
73e0: 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f  }.}   .static vo
73f0: 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69  id t1CountFinali
7400: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
7410: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
7420: 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20  t1CountCtx *p;. 
7430: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
7440: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
7450: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
7460: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
7470: 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32      if( p->n==42
7480: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7490: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
74a0: 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74  ontext, "x_count
74b0: 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c 20   totals to 42", 
74c0: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -1);.    }else{.
74d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
74e0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
74f0: 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b  , p ? p->n : 0);
7500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
7510: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
7520: 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c  CountStep(.  sql
7530: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7540: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7550: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
7560: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f  ue **argv.){.  /
7570: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 73 74 61  * no-op */.}.sta
7580: 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43  tic void legacyC
7590: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
75a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
75b0: 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65  ntext){.  sqlite
75c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
75d0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61 67  text, sqlite3_ag
75e0: 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f  gregate_count(co
75f0: 6e 74 65 78 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ntext));.}../*.*
7600: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
7610: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
7620: 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  te DB.**.** Call
7630: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
7640: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
7650: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
7660: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
7670: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
7680: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
7690: 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66  _count".  This f
76a0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
76b0: 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69  ar.** to the bui
76c0: 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75  lt-in count() fu
76d0: 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66  nction, with a f
76e0: 65 77 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b  ew special quirk
76f0: 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  s.** for testing
7700: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73   the sqlite3_res
7710: 75 6c 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73  ult_error() APIs
7720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
7730: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
7740: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
7750: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
7760: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
7770: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
7780: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7790: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
77a0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
77b0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
77c0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
77d0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
77e0: 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65  gic.  See misuse
77f0: 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  .test..**.** Thi
7800: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61  s routine was la
7810: 74 65 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20  ter extended to 
7820: 74 65 73 74 20 74 68 65 20 75 73 65 20 6f 66 20  test the use of 
7830: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7840: 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e  rror().** within
7850: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7860: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65  ions..**.** Late
7870: 72 3a 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73  r: It is now als
7880: 6f 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65  o extended to re
7890: 67 69 73 74 65 72 20 74 68 65 20 61 67 67 72 65  gister the aggre
78a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
78b0: 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29   "legacy_count()
78c0: 22 20 77 69 74 68 20 74 68 65 20 73 75 70 70 6c  " with the suppl
78d0: 69 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ied database han
78e0: 64 6c 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  dle. This is use
78f0: 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  d.** to test the
7900: 20 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69   deprecated sqli
7910: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7920: 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  unt() API..*/.st
7930: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
7940: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a  eate_aggregate(.
7950: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7960: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7970: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7980: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7990: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
79a0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
79b0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
79c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
79d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
79e0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
79f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
7a00: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
7a10: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
7a20: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
7a30: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
7a40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7a50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7a60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7a70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7a80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7a90: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
7aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7ab0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
7ac0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
7ad0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
7ae0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
7af0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
7b00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7b10: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
7b20: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
7b30: 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20  UTF8, 0, 0,.    
7b40: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
7b50: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
7b60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7b70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7b80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7b90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
7ba0: 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  ount", 1, SQLITE
7bb0: 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20  _UTF8, 0, 0,.   
7bc0: 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70       t1CountStep
7bd0: 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ,t1CountFinalize
7be0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
7bf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7c10: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7c20: 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74  b, "legacy_count
7c30: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 0, SQLITE_ANY
7c40: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
7c50: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 2c  legacyCountStep,
7c60: 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61   legacyCountFina
7c70: 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  lize.    );.  }.
7c80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
7c90: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
7ca0: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
7cb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
7cc0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
7cd0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
7ce0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
7cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7d00: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
7d10: 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54  ge:  printf TEXT
7d20: 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70  .**.** Send outp
7d30: 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55  ut to printf.  U
7d40: 73 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74  se this rather t
7d50: 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67  han puts to merg
7d60: 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  e the output.** 
7d70: 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  in the correct s
7d80: 65 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62  equence with deb
7d90: 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69  ugging printfs i
7da0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63  nserted into C c
7db0: 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65  ode..** Puts use
7dc0: 73 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66  s a separate buf
7dd0: 66 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e  fer and debuggin
7de0: 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c  g statements wil
7df0: 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73  l be out of.** s
7e00: 65 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73  equence if it is
7e10: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
7e20: 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66   int test_printf
7e30: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7e40: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7e50: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7e60: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7e70: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7e80: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7e90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7eb0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7ec0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ee0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7ef0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
7f00: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
7f10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7f20: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
7f30: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
7f40: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
7f50: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
7f60: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
7f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7f80: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
7f90: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
7fa0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
7fb0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
7fc0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
7fd0: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
7fe0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
7ff0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8000: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8010: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8020: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8030: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8040: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
8050: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8060: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8070: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8080: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8090: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
80a0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
80c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
80d0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
80e0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
80f0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8100: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8110: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63  int a[3], i;.  c
8120: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
8130: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
8140: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8150: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8160: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
8170: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
8180: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
8190: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
81a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
81b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
81c0: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
81d0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
81e0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
81f0: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
8200: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8210: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
8220: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
8230: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
8240: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
8250: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8260: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
8270: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
8280: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8290: 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72  ./*.** If zNum r
82a0: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74  epresents an int
82b0: 65 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66  eger that will f
82c0: 69 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74  it in 64-bits, t
82d0: 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c  hen set.** *pVal
82e0: 75 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67  ue to that integ
82f0: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72  er and return tr
8300: 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  ue.  Otherwise r
8310: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
8320: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8330: 65 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74  e3GetInt64(const
8340: 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34   char *zNum, i64
8350: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28   *pValue){.  if(
8360: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
8370: 42 69 74 73 28 7a 4e 75 6d 2c 20 30 29 20 29 7b  Bits(zNum, 0) ){
8380: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69  .    sqlite3Atoi
8390: 36 34 28 7a 4e 75 6d 2c 20 70 56 61 6c 75 65 29  64(zNum, pValue)
83a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
83b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
83d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
83e0: 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49 4e  _int64 FORMAT IN
83f0: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e  TEGER INTEGER IN
8400: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TEGER.**.** Call
8410: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68   mprintf with th
8420: 72 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ree 64-bit integ
8430: 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  er arguments.*/.
8440: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8450: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
8460: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
8470: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8480: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8490: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
84a0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
84b0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
84c0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
84e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
84f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8510: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
8520: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
8530: 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   i;.  sqlite_int
8540: 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20  64 a[3];.  char 
8550: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
8560: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
8570: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8580: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
8590: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
85a0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
85b0: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
85c0: 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20   INT\"", 0);.   
85d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
85e0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
85f0: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
8600: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 65 74   if( !sqlite3Get
8610: 49 6e 74 36 34 28 61 72 67 76 5b 69 5d 2c 20 26  Int64(argv[i], &
8620: 61 5b 69 2d 32 5d 29 20 29 7b 0a 20 20 20 20 20  a[i-2]) ){.     
8630: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8640: 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d  t(interp, "argum
8650: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  ent is not a val
8660: 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  id 64-bit intege
8670: 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  r", 0);.      re
8680: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20      }.  }.  z = 
86a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
86b0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
86c0: 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63  [1], a[2]);.  Tc
86d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
86e0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
86f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
8700: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
8720: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
8730: 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e  tf_str FORMAT IN
8740: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54  TEGER INTEGER ST
8750: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
8760: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f  mprintf with two
8770: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
8780: 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e  ts and one strin
8790: 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74  g argument.*/.st
87a0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
87b0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20  _mprintf_str(.  
87c0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
87d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
87e0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
87f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
8800: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
8810: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
8820: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8830: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8840: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8850: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
8860: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
8870: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8880: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
8890: 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  ], i;.  char *z;
88a0: 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c 7c  .  if( argc<4 ||
88b0: 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20 54   argc>5 ){.    T
88c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
88d0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
88e0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
88f0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8900: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
8910: 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c  NT INT ?STRING?\
8920: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
8930: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8940: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34  }.  for(i=2; i<4
8950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8960: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
8970: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
8980: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
8990: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
89a0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
89b0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
89c0: 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f  , a[1], argc>4 ?
89d0: 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29   argv[4] : NULL)
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 49 4e  _snprintf_str IN
8a50: 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49 4e 54  TEGER FORMAT INT
8a60: 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52  EGER INTEGER STR
8a70: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
8a80: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
8a90: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8aa0: 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67  s and one string
8ab0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
8ac0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8ad0: 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20  snprintf_str(.  
8ae0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
8af0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8b00: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
8b10: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
8b20: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
8b30: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
8b40: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8b50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b60: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8b70: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
8b80: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
8b90: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8ba0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
8bb0: 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ], i;.  int n;. 
8bc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
8bd0: 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36  argc<5 || argc>6
8be0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8bf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8c10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8c20: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8c30: 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e 54 20   INT FORMAT INT 
8c40: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
8c50: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c70: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
8c80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
8c90: 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
8ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e  L_ERROR;.  if( n
8cb0: 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  <0 ){.    Tcl_Ap
8cc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8cd0: 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f  p, "N must be no
8ce0: 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30 29 3b  n-negative", 0);
8cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8d00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
8d10: 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=3; i<5; i++){
8d20: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
8d30: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
8d40: 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20  [i], &a[i-3]) ) 
8d50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8d60: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
8d70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20  te3_malloc( n+1 
8d80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
8d90: 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76  rintf(n, z, argv
8da0: 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [2], a[0], a[1],
8db0: 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 35   argc>4 ? argv[5
8dc0: 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c  ] : NULL);.  Tcl
8dd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8de0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
8df0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
8e00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
8e20: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
8e30: 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20  f_double FORMAT 
8e40: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
8e50: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
8e60: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
8e70: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
8e80: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75  ents and one dou
8e90: 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ble argument.*/.
8ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8eb0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
8ec0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
8ed0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8ee0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ef0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8f00: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8f10: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8f20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f40: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f60: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f70: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f80: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f90: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75  t a[3], i;.  dou
8fa0: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ble r;.  char *z
8fb0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
8fc0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8fd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8fe0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8ff0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9000: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9010: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 44  FORMAT INT INT D
9020: 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20  OUBLE\"", 0);.  
9030: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9040: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9050: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
9060: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9070: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9080: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
9090: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90a0: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
90b0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
90c0: 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72 65  rgv[4], &r) ) re
90d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
90e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
90f0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
9100: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20  [0], a[1], r);. 
9110: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9120: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9130: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9140: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9150: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9160: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
9170: 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46 4f 52  rintf_scaled FOR
9180: 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c  MAT DOUBLE DOUBL
9190: 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  E.**.** Call mpr
91a0: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
91b0: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
91c0: 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
91d0: 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a  product of the.*
91e0: 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  * two arguments 
91f0: 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68  given above.  Th
9200: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  is is used to ge
9210: 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20  nerate overflow 
9220: 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a  and underflow.**
9230: 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74   doubles to test
9240: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
9250: 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c  onverted properl
9260: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
9270: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9280: 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69 64 20  _scaled(.  void 
9290: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
92a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
92b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
92c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
92d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
92e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
92f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9300: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9310: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9320: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9330: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9340: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9350: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75  {.  int i;.  dou
9360: 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72  ble r[2];.  char
9370: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9380: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
9390: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
93a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
93b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
93c0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
93d0: 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45   " FORMAT DOUBLE
93e0: 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a   DOUBLE\"", 0);.
93f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9400: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
9410: 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=2; i<4; i++){.
9420: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44      if( Tcl_GetD
9430: 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  ouble(interp, ar
9440: 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20  gv[i], &r[i-2]) 
9450: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9460: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
9470: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9480: 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d  gv[1], r[0]*r[1]
9490: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
94a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
94b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
94c0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
94d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
94e0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
94f0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
9500: 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a  y FORMAT STRING.
9510: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9520: 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  tf with a single
9530: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
9540: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72   which is the pr
9550: 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20  oduct of the.** 
9560: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69  two arguments gi
9570: 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73  ven above.  This
9580: 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65   is used to gene
9590: 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e  rate overflow an
95a0: 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64  d underflow.** d
95b0: 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74  oubles to test t
95c0: 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e  hat they are con
95d0: 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  verted properly.
95e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
95f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
9600: 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a  tronly(.  void *
9610: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9620: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9630: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
9640: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
9650: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
9660: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
9670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9690: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
96a0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
96b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
96c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
96d0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
96e0: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
96f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9700: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9710: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9720: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9730: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9740: 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a   STRING\"", 0);.
9750: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9760: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9770: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9780: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d  argv[1], argv[2]
9790: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
97a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
97b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
97c0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
97d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
97e0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
97f0: 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
9800: 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a  ble FORMAT HEX.*
9810: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9820: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9830: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9840: 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64  which is derived
9850: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78   from the.** hex
9860: 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e  adecimal encodin
9870: 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64 6f 75  g of an IEEE dou
9880: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
9890: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
98a0: 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a 20 20  tf_hexdouble(.  
98b0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
98c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
98d0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
98e0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
98f0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
9900: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
9910: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9930: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
9940: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
9950: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
9960: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
9970: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
9980: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
9990: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 31 2c  unsigned int x1,
99a0: 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69   x2;.  sqlite_ui
99b0: 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20 61 72  nt64 d;.  if( ar
99c0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
99d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
99e0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
99f0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
9a00: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
9a10: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52      " FORMAT STR
9a20: 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ING\"", 0);.    
9a30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9a40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61  ;.  }.  if( ssca
9a50: 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38  nf(argv[2], "%08
9a60: 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31  x%08x", &x2, &x1
9a70: 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )!=2 ){.    Tcl_
9a80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9a90: 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65  erp, "2nd argume
9aa0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d  nt should be 16-
9ab0: 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 68 65  characters of he
9ac0: 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  x", 0);.    retu
9ad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9ae0: 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20  }.  d = x2;.  d 
9af0: 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a  = (d<<32) + x1;.
9b00: 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c    memcpy(&r, &d,
9b10: 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a   sizeof(r));.  z
9b20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b30: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a  tf(argv[1], r);.
9b40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9b50: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9b60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9b70: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9b80: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9b90: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e  sage: sqlite3_en
9ba0: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
9bb0: 65 20 20 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a  e      BOOLEAN.*
9bc0: 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  *.*/.#if !define
9bd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
9be0: 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74  ARED_CACHE).stat
9bf0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62  ic int test_enab
9c00: 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69  le_shared(.  Cli
9c10: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
9c20: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
9c30: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
9c40: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
9c50: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9c60: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9c70: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9c80: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9c90: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9ca0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
9cb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9cc0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9cd0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
9ce0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
9cf0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
9d00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
9d10: 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69   int enable;.  i
9d20: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 65 78  nt ret = 0;.  ex
9d30: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
9d40: 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  SharedCacheEnabl
9d50: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ed;..  if( objc!
9d60: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
9d70: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9d80: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f  p, 1, objv, "BOO
9d90: 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
9da0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9db0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  }.  if( Tcl_GetB
9dc0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
9dd0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
9de0: 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  enable) ){.    r
9df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e00: 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c  .  }.  ret = sql
9e10: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
9e20: 6e 61 62 6c 65 64 3b 0a 20 20 72 63 20 3d 20 73  nabled;.  rc = s
9e30: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
9e40: 61 72 65 64 5f 63 61 63 68 65 28 65 6e 61 62 6c  ared_cache(enabl
9e50: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9e60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
9e70: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
9e80: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
9e90: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
9ea0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
9eb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9ec0: 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
9ed0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9ee0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
9ef0: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74  Obj(ret));.  ret
9f00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
9f10: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  ndif..../*.** Us
9f20: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
9f30: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
9f40: 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45  es   DB    BOOLE
9f50: 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  AN.**.*/.static 
9f60: 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65  int test_extende
9f70: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a  d_result_codes(.
9f80: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
9f90: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
9fa0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
9fb0: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
9fc0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
9fd0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9fe0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9ff0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a000: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a010: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a030: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a040: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
a050: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
a060: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
a070: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
a080: 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  enable;.  sqlite
a090: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
a0a0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
a0b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a0c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
a0d0: 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
a0e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a0f0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
a100: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
a110: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
a120: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
a130: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a140: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
a150: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
a160: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
a170: 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75   &enable) ) retu
a180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a190: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
a1a0: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62  _result_codes(db
a1b0: 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74  , enable);.  ret
a1c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a1d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a1e0: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
a1f0: 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  umber.**.*/.stat
a200: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76  ic int test_libv
a210: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20  ersion_number(. 
a220: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
a230: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
a240: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
a250: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
a260: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
a270: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a280: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a290: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a2a0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a2b0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a2d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a2e0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
a2f0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
a300: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
a310: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53  ts */.){.  Tcl_S
a320: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a330: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
a340: 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  j(sqlite3_libver
a350: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b  sion_number()));
a360: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
a380: 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  : sqlite3_table_
a390: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20  column_metadata 
a3a0: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
a3b0: 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a  e colname.**.*/.
a3c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a3d0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
a3e0: 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20  DATA.static int 
a3f0: 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
a400: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c  n_metadata(.  Cl
a410: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a420: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
a430: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
a440: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
a450: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
a460: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a470: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a480: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a490: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a4a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
a4b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a4c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a4d0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
a4e0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
a4f0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
a500: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
a510: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
a520: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
a530: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f  char *zTbl;.  co
a540: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
a550: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f    int rc;.  Tcl_
a560: 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f  Obj *pRet;..  co
a570: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74  nst char *zDatat
a580: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
a590: 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69  r *zCollseq;.  i
a5a0: 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e  nt notnull;.  in
a5b0: 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  t primarykey;.  
a5c0: 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e  int autoincremen
a5d0: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
a5e0: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
a5f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
a600: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64  , 1, objv, "DB d
a610: 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f  bname tblname co
a620: 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74  lname");.    ret
a630: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a640: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
a650: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
a660: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
a670: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
a680: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a690: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
a6a0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
a6b0: 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zTbl = Tcl_GetS
a6c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
a6d0: 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74    zCol = Tcl_Get
a6e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
a6f0: 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ..  if( strlen(z
a700: 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30  Db)==0 ) zDb = 0
a710: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
a720: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
a730: 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c  etadata(db, zDb,
a740: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20   zTbl, zCol, .  
a750: 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20      &zDatatype, 
a760: 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e  &zCollseq, &notn
a770: 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79  ull, &primarykey
a780: 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  , &autoincrement
a790: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
a7a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
a7b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7c0: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
a7d0: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
a7e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a7f0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
a800: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
a810: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
a820: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
a830: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
a840: 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65  ingObj(zDatatype
a850: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
a860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
a870: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
a880: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f  NewStringObj(zCo
a890: 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54  llseq, -1));.  T
a8a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
a8b0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
a8c0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
a8d0: 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f  otnull));.  Tcl_
a8e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
a8f0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
a900: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d  l_NewIntObj(prim
a910: 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f  arykey));.  Tcl_
a920: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
a930: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
a940: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f  l_NewIntObj(auto
a950: 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54  increment));.  T
a960: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a970: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
a980: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a990: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
a9a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
a9b0: 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20 73  NCRBLOB../*.** s
a9c0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
a9d0: 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54    CHANNEL OFFSET
a9e0: 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20   N.**.**   This 
a9f0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
aa00: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
aa10: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20  te3_blob_read() 
aa20: 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20  in ways that.** 
aa30: 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65    the Tcl channe
aa40: 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  l interface does
aa50: 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20   not. The first 
aa60: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  argument should.
aa70: 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65  **   be the name
aa80: 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e   of a valid chan
aa90: 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74  nel created by t
aaa0: 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65  he [incrblob] me
aab0: 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64  thod.**   of a d
aac0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
aad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
aae0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  lls sqlite3_blob
aaf0: 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20  _read().**   to 
ab00: 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72 6f  read N bytes fro
ab10: 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 20  m offset OFFSET 
ab20: 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
ab30: 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20  ing SQLite.**   
ab40: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a  blob handle..**.
ab50: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
ab60: 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f 62   a byte-array ob
ab70: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
ab80: 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69 73  the read data is
ab90: 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64 2e   .**   returned.
aba0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
abb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
abc0: 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ult is set to th
abd0: 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70 72  e.**   text repr
abe0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
abf0: 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  e returned error
ac00: 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51 4c   code (i.e. "SQL
ac10: 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20  ITE_NOMEM").**  
ac20: 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70   and a Tcl excep
ac30: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a  tion is thrown..
ac40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ac50: 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20  st_blob_read(.  
ac60: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ac70: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
ac80: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
ac90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
aca0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
acb0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
acc0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
acd0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
acf0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ad00: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
ad10: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
ad20: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
ad30: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
ad40: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
ad50: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
ad60: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71  stanceData;.  sq
ad70: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
ad80: 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  b;.  int notUsed
ad90: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
ada0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
adb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
adc0: 42 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Buf;.  int rc;. 
add0: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
ade0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
adf0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ae00: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
ae10: 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20  L OFFSET N");.  
ae20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ae30: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e  OR;.  }..  chann
ae40: 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  el = Tcl_GetChan
ae50: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
ae60: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ae70: 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ]), &notUsed);. 
ae80: 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20   if( !channel.  
ae90: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
aea0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
aeb0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
aec0: 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54  iOffset).   || T
aed0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
aee0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
aef0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65   objv[3], &nByte
af00: 29 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c 30 20  ).   || nByte<0 
af10: 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20 29  || iOffset<0.  )
af20: 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  { .    return TC
af30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
af40: 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54  instanceData = T
af50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
af60: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65  tanceData(channe
af70: 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28  l);.  pBlob = *(
af80: 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a  (sqlite3_blob **
af90: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a  )instanceData);.
afa0: 0a 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67  .  zBuf = (unsig
afb0: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41  ned char *)Tcl_A
afc0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 72  lloc(nByte);.  r
afd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
afe0: 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75  _read(pBlob, zBu
aff0: 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73 65  f, nByte, iOffse
b000: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
b020: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
b030: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
b040: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75 66  yteArrayObj(zBuf
b050: 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c  , nByte));.  }el
b060: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  se{.    Tcl_SetR
b070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
b080: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
b090: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
b0a0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
b0b0: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
b0c0: 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20  har *)zBuf);..  
b0d0: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
b0e0: 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a  TE_OK ? TCL_OK :
b0f0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a   TCL_ERROR);.}..
b100: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c  /*.** sqlite3_bl
b110: 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e 45 4c  ob_write CHANNEL
b120: 20 4f 46 46 53 45 54 20 44 41 54 41 0a 2a 2a 0a   OFFSET DATA.**.
b130: 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  **   This comman
b140: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
b150: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  t the sqlite3_bl
b160: 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20 77 61  ob_write() in wa
b170: 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65  ys that.**   the
b180: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74   Tcl channel int
b190: 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e  erface does not.
b1a0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b1b0: 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20  ent should.**   
b1c0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
b1d0: 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63   valid channel c
b1e0: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69  reated by the [i
b1f0: 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a  ncrblob] method.
b200: 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61  **   of a databa
b210: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
b220: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
b230: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
b240: 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  e().**   to writ
b250: 65 20 74 68 65 20 44 41 54 41 20 62 79 74 65 2d  e the DATA byte-
b260: 61 72 72 61 79 20 74 6f 20 74 68 65 20 75 6e 64  array to the und
b270: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 62  erlying SQLite b
b280: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20  lob handle..**  
b290: 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46 53 45   at offset OFFSE
b2a0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  T..**.**   On su
b2b0: 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74 79 20  ccess, an empty 
b2c0: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
b2d0: 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  ed. On failure, 
b2e0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0a  the interpreter.
b2f0: 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73 20 73  **   result is s
b300: 65 74 20 74 6f 20 74 68 65 20 74 65 78 74 20 72  et to the text r
b310: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
b320: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65 72   the returned er
b330: 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28  ror code .**   (
b340: 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  i.e. "SQLITE_NOM
b350: 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c 20 65  EM") and a Tcl e
b360: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
b370: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
b380: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74  t test_blob_writ
b390: 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
b3a0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
b3b0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
b3c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b3d0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b3e0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b3f0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b400: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b410: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b420: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b430: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b440: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b450: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b460: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b470: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
b480: 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61  nnel;.  ClientDa
b490: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  ta instanceData;
b4a0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b4b0: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f  *pBlob;.  int no
b4c0: 74 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 4f 66  tUsed;.  int iOf
b4d0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  fset;.  int rc;.
b4e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b4f0: 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42   *zBuf;.  int nB
b500: 75 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  uf;.  .  if( obj
b510: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
b520: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
b530: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
b540: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41  HANNEL OFFSET DA
b550: 54 41 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TA");.    return
b560: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b570: 0a 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  .  channel = Tcl
b580: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
b590: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b5a0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74  g(objv[1]), &not
b5b0: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 21 63 68  Used);.  if( !ch
b5c0: 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f  annel.   || TCL_
b5d0: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
b5e0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
b5f0: 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29  jv[2], &iOffset)
b600: 0a 20 20 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30  .   || iOffset<0
b610: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
b620: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b630: 0a 0a 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ..  instanceData
b640: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
b650: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
b660: 61 6e 6e 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  annel);.  pBlob 
b670: 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f  = *((sqlite3_blo
b680: 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  b **)instanceDat
b690: 61 29 3b 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63  a);..  zBuf = Tc
b6a0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
b6b0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
b6c0: 6e 42 75 66 29 3b 0a 20 20 72 63 20 3d 20 73 71  nBuf);.  rc = sq
b6d0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
b6e0: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
b6f0: 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  uf, iOffset);.  
b700: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b710: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
b720: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
b730: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
b740: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
b750: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
b760: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
b770: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
b780: 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f  CL_OK : TCL_ERRO
b790: 52 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  R);.}.#endif../*
b7a0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
b7b0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
b7c0: 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45  ion_v2 DB-HANDLE
b7d0: 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44   NAME CMP-PROC D
b7e0: 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20  EL-PROC.**.**   
b7f0: 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73  This Tcl proc is
b800: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
b810: 67 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74  g the experiment
b820: 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  al.**   sqlite3_
b830: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
b840: 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e  _v2() interface.
b850: 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43  .*/.struct TestC
b860: 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63  ollationX {.  Tc
b870: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b880: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
b890: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44  p;.  Tcl_Obj *pD
b8a0: 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  el;.};.typedef s
b8b0: 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74  truct TestCollat
b8c0: 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69  ionX TestCollati
b8d0: 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  onX;.static void
b8e0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
b8f0: 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43  tionDel(void *pC
b900: 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  tx){.  TestColla
b910: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
b920: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
b930: 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  x;..  int rc = T
b940: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
b950: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c  interp, p->pDel,
b960: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
b970: 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  |TCL_EVAL_GLOBAL
b980: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
b990: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  _OK ){.    Tcl_B
b9a0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
b9b0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a  ->interp);.  }..
b9c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b9d0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
b9e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b9f0: 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69  p->pDel);.  sqli
ba00: 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a  te3_free((void *
ba10: 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  )p);.}.static in
ba20: 74 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  t testCreateColl
ba30: 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64  ationCmp(.  void
ba40: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c   *pCtx,.  int nL
ba50: 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  eft,.  const voi
ba60: 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20  d *zLeft,.  int 
ba70: 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20  nRight,.  const 
ba80: 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a  void *zRight.){.
ba90: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
baa0: 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61   *p = (TestColla
bab0: 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20  tionX *)pCtx;.  
bac0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
bad0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
bae0: 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  Obj(p->pCmp);.  
baf0: 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20  int iRes = 0;.. 
bb00: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bb10: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63  t(pScript);.  Tc
bb20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bb30: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
bb40: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
bb50: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66  Obj((char *)zLef
bb60: 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63  t, nLeft));.  Tc
bb70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bb80: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
bb90: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
bba0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67  Obj((char *)zRig
bbb0: 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20  ht,nRight));..  
bbc0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
bbd0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
bbe0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43  erp, pScript, TC
bbf0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
bc00: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20  L_EVAL_GLOBAL). 
bc10: 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c    || TCL_OK!=Tcl
bc20: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70  _GetIntFromObj(p
bc30: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  ->interp, Tcl_Ge
bc40: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
bc50: 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20  terp), &iRes).  
bc60: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
bc70: 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e  roundError(p->in
bc80: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
bc90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
bca0: 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72  cript);..  retur
bcb0: 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63  n iRes;.}.static
bcc0: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
bcd0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
bce0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
bcf0: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
bd00: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
bd10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
bd20: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
bd30: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
bd40: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
bd50: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bd80: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
bd90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
bda0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
bdb0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73  ents */.){.  Tes
bdc0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a  tCollationX *p;.
bdd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
bde0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
bdf0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
be00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
be10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
be20: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45   "DB-HANDLE NAME
be30: 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52   CMP-PROC DEL-PR
be40: 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OC");.    return
be50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
be60: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
be70: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
be80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
be90: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
bea0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70   TCL_ERROR;..  p
beb0: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
bec0: 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  nX *)sqlite3_mal
bed0: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43  loc(sizeof(TestC
bee0: 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70  ollationX));.  p
bef0: 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d  ->pCmp = objv[3]
bf00: 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62  ;.  p->pDel = ob
bf10: 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65  jv[4];.  p->inte
bf20: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54  rp = interp;.  T
bf30: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
bf40: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
bf50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
bf60: 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pDel);..  rc = s
bf70: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
bf80: 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54  llation_v2(db, T
bf90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bfa0: 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20  v[2]), 16, .    
bfb0: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
bfc0: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
bfd0: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
bfe0: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
bff0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c000: 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20  E_MISUSE ){.    
c010: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c020: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
c030: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65  3_create_collate
c040: 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20  _v2() failed to 
c050: 64 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22  detect ".      "
c060: 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64  an invalid encod
c070: 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ing", (char*)0);
c080: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c090: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
c0a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c0b0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c0c0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c0d0: 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45  objv[2]), SQLITE
c0e0: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76  _UTF8, .      (v
c0f0: 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65  oid *)p, testCre
c100: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c  ateCollationCmp,
c110: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c120: 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72  tionDel.  );.  r
c130: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c140: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
c150: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
c160: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
c170: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
c180: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
c190: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
c1a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c1b0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
c1c0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
c1d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
c1e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
c1f0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
c200: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
c210: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
c220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c230: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c240: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c250: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
c260: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c270: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
c280: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
c290: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c2a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
c2b0: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
c2c0: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
c2d0: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
c2e0: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
c2f0: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
c300: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
c310: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c320: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
c330: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
c340: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
c350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c360: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
c370: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
c380: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
c390: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
c3a0: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
c3b0: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
c3c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c3d0: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
c3e0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
c3f0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c400: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
c410: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
c420: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
c430: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
c440: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
c450: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
c460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c470: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
c480: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
c490: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
c4a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c4b0: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
c4c0: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
c4d0: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
c4e0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
c4f0: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
c500: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
c510: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
c520: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
c530: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
c540: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
c550: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
c560: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
c570: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
c580: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
c590: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
c5a0: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
c5b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
c5c0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
c5d0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c5e0: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
c5f0: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
c600: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
c610: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
c620: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
c630: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
c640: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
c650: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
c660: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
c670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c680: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
c690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
c6a0: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
c6b0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
c6c0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
c6d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
c6e0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
c6f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c700: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
c710: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
c720: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
c730: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
c740: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
c750: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
c760: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
c770: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c780: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c790: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c7a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c7b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c7c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c7d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c7e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c7f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c810: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c820: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c830: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c840: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c850: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
c860: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
c870: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
c880: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
c890: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
c8a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c8b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
c8c0: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
c8d0: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
c8e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c8f0: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
c900: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c910: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
c920: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
c930: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
c940: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
c950: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
c960: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
c970: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
c980: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
c990: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c9a0: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
c9b0: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
c9c0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c9d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c9e0: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
c9f0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
ca00: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
ca10: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
ca20: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
ca30: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
ca40: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
ca50: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
ca60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ca70: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
ca80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
ca90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
caa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
cab0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
cac0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
cad0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
cae0: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
caf0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
cb00: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
cb10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
cb20: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
cb30: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
cb40: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
cb50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
cb60: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cb70: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
cb80: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
cb90: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
cba0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
cbb0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
cbc0: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
cbd0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
cbe0: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
cbf0: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
cc00: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
cc10: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
cc20: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
cc30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc40: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
cc50: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
cc60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cc70: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
cc80: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
cc90: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
cca0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
ccb0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
ccc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ccd0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
cce0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
ccf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
cd00: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
cd10: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
cd20: 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20   interp==0 );   
cd30: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77  /* This will alw
cd40: 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65  ays fail */.  re
cd50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
cd60: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
cd70: 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61  ing routine is a
cd80: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
cd90: 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65  L function whose
cda0: 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74   purpose.** is t
cdb0: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
cdc0: 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41  e_set_result() A
cdd0: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PI..*/.static vo
cde0: 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69  id testFunc(sqli
cdf0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
ce00: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
ce10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
ce20: 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20  argv){.  while( 
ce30: 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63  argc>=2 ){.    c
ce40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30  onst char *zArg0
ce50: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ce60: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
ce70: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[0]);.    if( z
ce80: 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66  Arg0 ){.      if
ce90: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
cea0: 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22  Cmp(zArg0, "int"
ceb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
cec0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
ced0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
cee0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
cef0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
cf00: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
cf10: 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36  ICmp(zArg0,"int6
cf20: 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  4")==0 ){.      
cf30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cf40: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
cf50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
cf60: 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  t64(argv[1]));. 
cf70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
cf80: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
cf90: 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30  rg0,"string")==0
cfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
cfb0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
cfc0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
cfd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
cfe0: 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c  xt(argv[1]), -1,
cff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
d000: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d010: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d020: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
d030: 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Arg0,"double")==
d040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
d050: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
d060: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  le(context, sqli
d070: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
d080: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
d090: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
d0a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
d0b0: 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
d0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
d0d0: 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65  esult_null(conte
d0e0: 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xt);.      }else
d0f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
d100: 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65  Cmp(zArg0,"value
d110: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
d120: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d130: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
d140: 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75  rgv[sqlite3_valu
d150: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29  e_int(argv[1])])
d160: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d170: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
d180: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
d190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d1a0: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
d1b0: 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d      }.    argc -
d1c0: 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d  = 2;.    argv +=
d1d0: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
d1e0: 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  ;..error_out:.  
d1f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
d200: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69  rror(context,"fi
d210: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
d220: 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
d230: 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36  .      "int int6
d240: 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20  4 string double 
d250: 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29  null value", -1)
d260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d270: 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73  :   sqlite_regis
d280: 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
d290: 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a  n  DB  NAME.**.*
d2a0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 74  * Register the t
d2b0: 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  est SQL function
d2c0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d2d0: 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61   DB under the na
d2e0: 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74  me NAME..*/.stat
d2f0: 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69  ic int test_regi
d300: 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69  ster_func(.  voi
d310: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
d320: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d330: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
d340: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
d350: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
d360: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
d370: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
d380: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
d390: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
d3a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
d3b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
d3c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
d3d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
d3e0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
d3f0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
d400: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d410: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
d420: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
d430: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
d440: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46  , .       " DB F
d450: 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30  UNCTION-NAME", 0
d460: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d470: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
d480: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
d490: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
d4a0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d4b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
d4c0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d4d0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67  function(db, arg
d4e0: 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[2], -1, SQLITE
d4f0: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
d500: 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29   testFunc, 0, 0)
d510: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
d520: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
d530: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
d540: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
d550: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d570: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
d580: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
d590: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
d5a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
d5b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d5c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
d5d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20  lite3_finalize  
d5e0: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  STMT .**.** Fina
d5f0: 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74  lize a statement
d600: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
d610: 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61  ic int test_fina
d620: 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  lize(.  void * c
d630: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d640: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d650: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d660: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d670: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
d680: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
d690: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
d6a0: 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69  e3 *db = 0;..  i
d6b0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
d6c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d6d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
d6e0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
d6f0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
d700: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
d710: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
d720: 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
d750: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
d760: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d770: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d780: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
d790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
d7a0: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
d7b0: 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28    db = StmtToDb(
d7c0: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63  pStmt);.  }.  rc
d7d0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
d7e0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  ize(pStmt);.  Tc
d7f0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d800: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
d810: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
d820: 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
d830: 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 73  db && sqlite3Tes
d840: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
d850: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
d860: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
d870: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
d880: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
d890: 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74  qlite3_next_stmt
d8a0: 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a    DB  STMT.**.**
d8b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   Return the next
d8c0: 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71   statment in seq
d8d0: 75 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54  uence after STMT
d8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8f0: 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a  test_next_stmt(.
d900: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
d910: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
d920: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
d930: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
d940: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
d950: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
d960: 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74   *pStmt;.  sqlit
d970: 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68  e3 *db = 0;.  ch
d980: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20  ar zBuf[50];..  
d990: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
d9a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d9b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
d9c0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
d9d0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
d9e0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
d9f0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
da00: 30 29 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20  0), " DB STMT", 
da10: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
da20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
da30: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
da40: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
da50: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
da60: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
da70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
da80: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
da90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
daa0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
dab0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
dac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53   TCL_ERROR;.  pS
dad0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65  tmt = sqlite3_ne
dae0: 78 74 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d  xt_stmt(db, pStm
daf0: 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  t);.  if( pStmt 
db00: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
db10: 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
db20: 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
db30: 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
db40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
db50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
db60: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
db70: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
db80: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
db90: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
dba0: 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20  te3_reset  STMT 
dbb0: 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  .**.** Reset a s
dbc0: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
dbd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
dbe0: 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
dbf0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
dc00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dc10: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
dc20: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
dc30: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
dc40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
dc50: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
dc60: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
dc70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
dc80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
dc90: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
dca0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
dcb0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
dcc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
dcd0: 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
dce0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
dcf0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
dd00: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
dd10: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
dd20: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
dd30: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
dd40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dd50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
dd60: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
dd70: 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
dd80: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
dd90: 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
dda0: 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
ddb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ddc0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
ddd0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
dde0: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
ddf0: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
de00: 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
de10: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
de20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
de30: 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
de40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
de50: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
de60: 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
de70: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
de80: 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
de90: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
dea0: 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
deb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dec0: 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
ded0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
dee0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
def0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
df00: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
df10: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
df20: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
df30: 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
df40: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
df50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
df60: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
df70: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
df80: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
df90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
dfa0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
dfb0: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
dfc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dfd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
dfe0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
dff0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e000: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
e010: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
e020: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
e030: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e040: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
e050: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
e060: 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  red(pStmt)));.  
e070: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
e080: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
e090: 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72  sqlite3_transfer
e0a0: 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54  _bindings FROMST
e0b0: 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  MT TOSTMT.**.** 
e0c0: 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e  Transfer all bin
e0d0: 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53  dings from FROMS
e0e0: 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53 54  TMT over to TOST
e0f0: 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  MT.*/.static int
e100: 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
e110: 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ind(.  void * cl
e120: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e130: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e140: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e150: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e160: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
e170: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a  _stmt *pStmt1, *
e180: 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62  pStmt2;.  if( ob
e190: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
e1a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e1b0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e1c0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e1d0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
e1e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e1f0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
e200: 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d  FROM-STMT TO-STM
e210: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
e220: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e230: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
e240: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
e250: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e260: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29  v[1]), &pStmt1))
e270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e280: 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
e290: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
e2a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e2b0: 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29  jv[2]), &pStmt2)
e2c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e2d0: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
e2e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
e2f0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
e300: 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  bj(sqlite3_trans
e310: 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  fer_bindings(pSt
e320: 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 20  mt1,pStmt2)));. 
e330: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e340: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
e350: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
e360: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
e370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
e380: 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
e390: 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
e3a0: 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
e3b0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
e3c0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61  tic int test_cha
e3d0: 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  nges(.  void * c
e3e0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
e3f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e400: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
e410: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
e420: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
e430: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
e440: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
e450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e460: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
e470: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
e480: 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ",.       Tcl_Ge
e490: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
e4a0: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
e4b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e4c0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
e4d0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
e4e0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e4f0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
e500: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e510: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
e520: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
e530: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
e540: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
e550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
e560: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
e570: 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63  s is the "static
e580: 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61  _bind_value" tha
e590: 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
e5a0: 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a  bound to when.**
e5b0: 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e   the FLAG option
e5c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   of sqlite3_bind
e5d0: 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a   is "static".*/.
e5e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c  static char *sql
e5f0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
e600: 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69  value = 0;.stati
e610: 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61  c int sqlite_sta
e620: 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d  tic_bind_nbyte =
e630: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   0;../*.** Usage
e640: 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  :  sqlite3_bind 
e650: 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20   VM  IDX  VALUE 
e660: 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74   FLAGS.**.** Set
e670: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
e680: 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72 61  he IDX-th occura
e690: 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68  nce of "?" in th
e6a0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a  e original SQL.*
e6b0: 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45  * string.  VALUE
e6c0: 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75   is the new valu
e6d0: 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e  e.  If FLAGS=="n
e6e0: 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20  ull" then VALUE 
e6f0: 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  is.** ignored an
e700: 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73  d the value is s
e710: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  et to NULL.  If 
e720: 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20  FLAGS=="static" 
e730: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
e740: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
e750: 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69  value of a stati
e760: 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64  c variable named
e770: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74  .** "sqlite_stat
e780: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20  ic_bind_value". 
e790: 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d   If FLAGS=="norm
e7a0: 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a  al" then a copy.
e7b0: 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20  ** of the VALUE 
e7c0: 69 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41  is made.  If FLA
e7d0: 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65  GS=="blob10" the
e7e0: 6e 20 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e  n a VALUE is ign
e7f0: 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d  ored.** an a 10-
e800: 62 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30  byte blob "abc\0
e810: 30 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20  00xyz\000pq" is 
e820: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61  inserted..*/.sta
e830: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
e840: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
e850: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
e860: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
e870: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
e880: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
e890: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
e8a0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
e8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e8c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
e8d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
e8e0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
e8f0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
e900: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
e910: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e920: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
e930: 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72  nt idx;.  if( ar
e940: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
e950: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e960: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e970: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e980: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
e990: 20 20 20 20 20 22 20 56 4d 20 49 44 58 20 56 41       " VM IDX VA
e9a0: 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63  LUE (null|static
e9b0: 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b  |normal)\"", 0);
e9c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e9d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e9e0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
e9f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
ea00: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
ea10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ea20: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
ea30: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
ea40: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
ea50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
ea60: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
ea70: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
ea80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
ea90: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64  d_null(pStmt, id
eaa0: 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  x);.  }else if( 
eab0: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
eac0: 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20  static")==0 ){. 
ead0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
eae0: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
eaf0: 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61   idx, sqlite_sta
eb00: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20  tic_bind_value, 
eb10: 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  -1, 0);.  }else 
eb20: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
eb30: 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79 74 65  4],"static-nbyte
eb40: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  s")==0 ){.    rc
eb50: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
eb60: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
eb70: 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
eb80: 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20  ind_value,.     
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f    sqlite_static_
ebc0: 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a  bind_nbyte, 0);.
ebd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
ebe0: 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d  mp(argv[4],"norm
ebf0: 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  al")==0 ){.    r
ec00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
ec10: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
ec20: 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53  , argv[3], -1, S
ec30: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ec40: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
ec50: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c  rcmp(argv[4],"bl
ec60: 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ob10")==0 ){.   
ec70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
ec80: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
ec90: 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79 7a 5c  dx, "abc\000xyz\
eca0: 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51 4c 49  000pq", 10, SQLI
ecb0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
ecc0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
ecd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ece0: 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74 20  , "4th argument 
ecf0: 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
ed00: 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72      "\"null\" or
ed10: 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20 5c   \"static\" or \
ed20: 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a  "normal\"", 0);.
ed30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ed40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ed50: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
ed60: 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
ed70: 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
ed80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ed90: 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
eda0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
edb0: 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ];.    sprintf(z
edc0: 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
edd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
ede0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
edf0: 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72  zBuf, sqlite3Err
ee00: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
ee10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee20: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
ee30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  TCL_OK;.}..#ifnd
ee40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
ee50: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  TF16./*.** Usage
ee60: 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61  : add_test_colla
ee70: 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  te <db ptr> <utf
ee80: 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
ee90: 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
eea0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
eeb0: 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
eec0: 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
eed0: 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61  he correct colla
eee0: 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65  tion.** sequence
eef0: 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
ef00: 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
ef10: 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
ef20: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
ef30: 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
ef40: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
ef50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
ef60: 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61  isters the colla
ef70: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74  tion sequence "t
ef80: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20  est_collate".** 
ef90: 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
efa0: 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73  ndle <db>. The s
efb0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d  econd argument m
efc0: 75 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66  ust be a list of
efd0: 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61   three.** boolea
efe0: 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65  n values. If the
eff0: 20 66 69 72 73 74 20 69 73 20 74 72 75 65 2c 20   first is true, 
f000: 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f  then a version o
f010: 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69  f test_collate i
f020: 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  s.** registered 
f030: 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68  for UTF-8, if th
f040: 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65  e second is true
f050: 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72  , a version is r
f060: 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a  egistered for.**
f070: 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
f080: 65 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  e third is true,
f090: 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
f0a0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
f0b0: 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65  ..** Previous ve
f0c0: 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63  rsions of test_c
f0d0: 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74  ollate are delet
f0e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ed..**.** The co
f0f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f100: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73   test_collate is
f110: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
f120: 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66  calling the.** f
f130: 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72  ollowing TCL scr
f140: 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65  ipt:.**.**   "te
f150: 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e  st_collate <enc>
f160: 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a   <lhs> <rhs>".**
f170: 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e  .** The <lhs> an
f180: 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20  d <rhs> are the 
f190: 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67  two values being
f1a0: 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64   compared, encod
f1b0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
f1c0: 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65  The <enc> parame
f1d0: 74 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64  ter is the encod
f1e0: 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ing of the colla
f1f0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68  tion function th
f200: 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c  at.** SQLite sel
f210: 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54  ected to call. T
f220: 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
f230: 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  pt implements th
f240: 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61  e.** "test_colla
f250: 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20  te" proc..**.** 
f260: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 77  Note that this w
f270: 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69  ill only work wi
f280: 74 68 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65  th one inteprete
f290: 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20  r at a time, as 
f2a0: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f  the.** interp po
f2b0: 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77 68 65  inter to use whe
f2c0: 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  n evaluating the
f2d0: 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 73   TCL script is s
f2e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73  tored in.** pTes
f2f0: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a  tCollateInterp..
f300: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e  */.static Tcl_In
f310: 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61  terp* pTestColla
f320: 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63  teInterp;.static
f330: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
f340: 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  e_func(.  void *
f350: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c  pCtx, .  int nA,
f360: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
f370: 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74  .  int nB, const
f380: 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54   void *zB.){.  T
f390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70  cl_Interp *i = p
f3a0: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
f3b0: 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d  p;.  int encin =
f3c0: 20 28 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e   (int)pCtx;.  in
f3d0: 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  t res;.  int n;.
f3e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
f3f0: 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62   *pVal;.  Tcl_Ob
f400: 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54  j *pX;..  pX = T
f410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f420: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
f430: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
f440: 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20  efCount(pX);..  
f450: 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b  switch( encin ){
f460: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f470: 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c  _UTF8:.      Tcl
f480: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f490: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
f4a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
f4b0: 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  -8",-1));.      
f4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f4d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a  SQLITE_UTF16LE:.
f4e0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
f4f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f500: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
f510: 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
f520: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
f530: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
f540: 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20  TE_UTF16BE:.    
f550: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f560: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
f570: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f580: 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29  ("UTF-16BE",-1))
f590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f5a0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f5b0: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
f5c0: 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ..  pVal = sqlit
f5d0: 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
f5e0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
f5f0: 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
f600: 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
f610: 53 54 41 54 49 43 29 3b 0a 20 20 6e 20 3d 20 73  STATIC);.  n = s
f620: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
f630: 65 73 28 70 56 61 6c 29 3b 0a 20 20 54 63 6c 5f  es(pVal);.  Tcl_
f640: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f650: 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20  ment(i,pX,.     
f660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f670: 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
f680: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
f690: 29 2c 6e 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ),n));.  sqlite3
f6a0: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
f6b0: 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c  , nB, zB, encin,
f6c0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
f6d0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
f6e0: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
f6f0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
f700: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
f710: 58 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  X,.      Tcl_New
f720: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
f730: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
f740: 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20  ext(pVal),n));. 
f750: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
f760: 65 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f  e(pVal);..  Tcl_
f770: 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
f780: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
f790: 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
f7a0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
f7b0: 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
f7c0: 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
f7d0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
f7e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
f7f0: 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
f800: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
f810: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f820: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
f830: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
f840: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
f850: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
f860: 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
f870: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
f880: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
f890: 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
f8a0: 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c  args;.  pTestCol
f8b0: 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74  lateInterp = int
f8c0: 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62  erp;.  if( getDb
f8d0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
f8e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f8f0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
f900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f910: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
f920: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
f930: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f940: 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
f950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f960: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f970: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
f980: 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
f990: 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
f9a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
f9b0: 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
f9c0: 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
f9d0: 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
f9e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f9f0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
fa00: 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69  d *zUtf16;.    i
fa10: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
fa20: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
fa30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
fa40: 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
fa50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fa60: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
fa70: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
fa80: 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
fa90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
faa0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
fab0: 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
fac0: 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16LE, val?test_
fad0: 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
fae0: 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
faf0: 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
fb00: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
fb10: 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
fb20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fb30: 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  ;..#if 0.    if(
fb40: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
fb50: 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
fb60: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
fb70: 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
fb80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
fb90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
fba0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
fbb0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
fbc0: 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
fbd0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
fbe0: 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63  Val, -1, "test_c
fbf0: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
fc00: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
fc10: 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36  TIC);.    zUtf16
fc20: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
fc30: 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
fc40: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
fc50: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
fc60: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
fc70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
fc80: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
fc90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fca0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
fcb0: 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
fcc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
fcd0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
fce0: 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
fcf0: 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
fd00: 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
fd10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
fd20: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
fd30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fd40: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
fd50: 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  x);.  }.  if( sq
fd60: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
fd70: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
fd80: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fd90: 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  ROR;.  .  if( rc
fda0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fdb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fdc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
fdd0: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
fde0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
fdf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fe00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
fe10: 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
fe20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
fe30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
fe40: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
fe50: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
fe60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
fe70: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
fe80: 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c   " <DB> <utf8> <
fe90: 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
fea0: 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  e>", 0);.  retur
feb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
fec0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  /*.** When the c
fed0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
fee0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
fef0: 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ked, record the 
ff00: 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  name of .** the 
ff10: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
ff20: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  ing function her
ff30: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64  e.  The recorded
ff40: 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a   name is linked.
ff50: 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69  ** to a TCL vari
ff60: 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f  able and used to
ff70: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
ff80: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
ff90: 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20  llation.** name 
ffa0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  is correct..*/.s
ffb0: 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64  tatic char zNeed
ffc0: 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d  edCollation[200]
ffd0: 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  ;.static char *p
ffe0: 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
fff0: 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   = zNeededCollat
10000 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ion;.../*.** Cal
10010 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61  led when a colla
10020 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
10030 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74   needed.  Regist
10040 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ered using.** sq
10050 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
10060 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73  needed16()..*/.s
10070 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
10080 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
10090 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
100a0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
100b0 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
100c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
100d0 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Name.){.  int en
100e0 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69  c = ENC(db);.  i
100f0 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
10100 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72  .  for(z = (char
10110 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a  *)pName, i=0; *z
10120 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a   || z[1]; z++){.
10130 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65      if( *z ) zNe
10140 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b  ededCollation[i+
10150 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a  +] = *z;.  }.  z
10160 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
10170 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
10180 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
10190 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74  on(.      db, "t
101a0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e  est_collate", EN
101b0 43 28 64 62 29 2c 20 28 76 6f 69 64 20 2a 29 65  C(db), (void *)e
101c0 6e 63 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nc, test_collate
101d0 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _func);.}../*.**
101e0 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
101f0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20  _collate_needed 
10200 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
10210 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
10220 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  eded(.  void * c
10230 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10240 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10250 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10260 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10270 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10280 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
10290 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
102a0 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
102b0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
102c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
102d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
102e0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
102f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
10300 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  c = sqlite3_coll
10310 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64  ation_needed16(d
10320 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  b, 0, test_colla
10330 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20  te_needed_cb);. 
10340 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
10350 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  n[0] = 0;.  if( 
10360 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
10370 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
10380 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
10390 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
103a0 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
103b0 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
103c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
103d0 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
103e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
103f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
10400 64 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65  d:   add_alignme
10410 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
10420 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64  ns  DB.**.** Add
10430 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69   two new collati
10440 6e 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20  ng sequences to 
10450 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a  the database DB.
10460 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  **.**     utf16_
10470 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75  aligned.**     u
10480 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a  tf16_unaligned.*
10490 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  *.** Both collat
104a0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
104b0 65 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20  e the same sort 
104c0 6f 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e  order as BINARY.
104d0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66  .** The only dif
104e0 66 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20  ference is that 
104f0 74 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65  the utf16_aligne
10500 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  d collating.** s
10510 65 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61  equence is decla
10520 72 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  red with the SQL
10530 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
10540 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20  D flag..** Both 
10550 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
10560 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ons increment th
10570 65 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31  e unaligned utf1
10580 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65  6 counter.** whe
10590 6e 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61  never they see a
105a0 20 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67   string that beg
105b0 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79  ins on an odd by
105c0 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
105d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69  static int unali
105e0 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
105f0 74 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ter = 0;.static 
10600 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c  int alignmentCol
10610 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
10620 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
10630 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
10640 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
10650 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
10660 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
10670 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
10680 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
10690 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20   : nKey2;.  if( 
106a0 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31  nKey1>0 && 1==(1
106b0 26 28 69 6e 74 29 70 4b 65 79 31 29 20 29 20 75  &(int)pKey1) ) u
106c0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
106d0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28  counter++;.  if(
106e0 20 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28   nKey2>0 && 1==(
106f0 31 26 28 69 6e 74 29 70 4b 65 79 32 29 20 29 20  1&(int)pKey2) ) 
10700 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
10710 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63  _counter++;.  rc
10720 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
10730 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
10740 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
10750 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
10760 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
10770 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
10780 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
10790 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a  est_collations(.
107a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
107b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
107c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
107d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
107e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
107f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
10800 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29  .  if( objc>=2 )
10810 7b 0a 20 20 20 20 69 66 28 20 67 65 74 44 62 50  {.    if( getDbP
10820 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10830 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10840 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10850 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10860 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
10870 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
10880 20 22 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65   "utf16_unaligne
10890 64 22 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  d",.        SQLI
108a0 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20  TE_UTF16, .     
108b0 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43     0, alignmentC
108c0 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71  ollFunc);.    sq
108d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
108e0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
108f0 36 5f 61 6c 69 67 6e 65 64 22 2c 0a 20 20 20 20  6_aligned",.    
10900 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36      SQLITE_UTF16
10910 20 7c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   | SQLITE_UTF16_
10920 41 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20  ALIGNED, .      
10930 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f    0, alignmentCo
10940 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72  llFunc);.  }.  r
10950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10960 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
10970 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10980 54 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a  T_UTF16) */../*.
10990 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
109a0 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20  st_function <db 
109b0 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
109c0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
109d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
109e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
109f0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
10a00 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
10a10 65 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63  ect user.** func
10a20 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68  tion callback wh
10a30 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
10a40 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
10a50 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
10a60 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
10a70 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
10a80 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
10a90 20 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f   registers up to
10aa0 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
10ab0 6f 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  of the user func
10ac0 74 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75  tion.** "test_fu
10ad0 6e 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74  nction" with dat
10ae0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62  abase handle <db
10af0 3e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  >.  If the secon
10b00 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  d argument is.**
10b10 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65   true, then a ve
10b20 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75  rsion of test_fu
10b30 6e 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74  nction is regist
10b40 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  ered for UTF-8, 
10b50 69 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20  if the.** third 
10b60 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69  is true, a versi
10b70 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
10b80 20 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69   for UTF-16le, i
10b90 66 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a  f the fourth is.
10ba0 2a 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31  ** true, a UTF-1
10bb0 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61  6be version is a
10bc0 76 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69  vailable.  Previ
10bd0 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a  ous versions of.
10be0 2a 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  ** test_function
10bf0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a   are deleted..**
10c00 0a 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e  .** The user fun
10c10 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
10c20 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  nted by calling 
10c30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43  the following TC
10c40 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20  L script:.**.** 
10c50 20 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e    "test_function
10c60 20 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a   <enc> <arg>".**
10c70 0a 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20  .** Where <enc> 
10c80 69 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c  is one of UTF-8,
10c90 20 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46   UTF-16LE or UTF
10ca0 31 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20  16BE, and <arg> 
10cb0 69 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  is the.** single
10cc0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
10cd0 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63   to the SQL func
10ce0 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
10cf0 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74  returned by.** t
10d00 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
10d10 20 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74   used as the ret
10d20 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
10d30 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49   SQL function. I
10d40 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74  t.** is passed t
10d50 6f 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55  o SQLite using U
10d60 54 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54  TF-16BE for a UT
10d70 46 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  F-8 test_functio
10d80 6e 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f  n(), UTF-8.** fo
10d90 72 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73  r a UTF-16LE tes
10da0 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  t_function(), an
10db0 64 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61  d UTF-16LE for a
10dc0 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
10dd0 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73   that.** prefers
10de0 20 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69   UTF-16BE..*/.#i
10df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10e00 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76  T_UTF16.static v
10e10 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
10e20 6e 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65  n_utf8(.  sqlite
10e30 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
10e40 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
10e50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10e60 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
10e70 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
10e80 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
10e90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
10ea0 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
10eb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
10ec0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
10ed0 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
10ee0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
10ef0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
10f00 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
10f10 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
10f20 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10f30 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
10f40 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
10f50 4f 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29  Obj("UTF-8", -1)
10f60 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
10f70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10f80 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
10f90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10fa0 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
10fb0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
10fc0 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
10fd0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
10fe0 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
10ff0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
11000 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  X);.  sqlite3_re
11010 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
11020 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
11030 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c  ult(interp), -1,
11040 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
11050 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  T);.  pVal = sql
11060 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
11070 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
11080 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
11090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
110a0 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
110b0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
110c0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
110d0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
110e0 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c  t_text16be(pCtx,
110f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
11100 65 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20  ext16be(pVal),. 
11110 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
11120 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
11130 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
11140 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
11150 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
11160 6e 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c  n_utf16le(.  sql
11170 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
11180 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
11190 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
111a0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
111b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
111c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
111d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
111e0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
111f0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
11200 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
11210 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
11220 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11230 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
11240 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
11250 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
11260 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11270 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11280 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
11290 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
112a0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
112b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
112c0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
112d0 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
112e0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
112f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11300 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
11310 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
11320 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
11330 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
11340 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
11350 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
11360 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
11370 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
11380 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
11390 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
113a0 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
113b0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
113c0 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
113d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
113e0 78 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  x,(char*)sqlite3
113f0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
11400 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e  ),-1,SQLITE_TRAN
11410 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
11420 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
11430 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
11440 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
11450 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33  f16be(.  sqlite3
11460 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
11470 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
11480 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
11490 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
114a0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
114b0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
114c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
114d0 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
114e0 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
114f0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
11500 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
11510 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
11520 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
11530 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
11540 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
11550 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11560 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
11570 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11580 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d  bj("UTF-16BE", -
11590 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
115a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
115b0 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
115c0 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
115d0 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
115e0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
115f0 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
11600 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
11610 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
11620 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
11630 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
11640 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
11650 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
11660 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
11670 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
11680 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
11690 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
116a0 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
116b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
116c0 75 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c  ult_text16(pCtx,
116d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
116e0 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
116f0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
11700 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
11710 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
11720 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69  t16be(pCtx, sqli
11730 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
11740 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
11750 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
11760 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
11770 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
11780 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
11790 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
117a0 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
117b0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
117c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
117d0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65  Free(pVal);.}.#e
117e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
117f0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61  MIT_UTF16 */.sta
11800 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e  tic int test_fun
11810 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
11820 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11830 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11840 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11850 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11860 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
11870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
11880 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
11890 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
118a0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
118b0 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
118c0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
118d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
118e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
118f0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
11900 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
11910 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
11920 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11930 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
11940 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
11950 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
11960 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
11970 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11980 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
11990 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
119a0 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
119b0 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
119c0 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
119d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
119e0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
119f0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11a00 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
11a10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11a20 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
11a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
11a40 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
11a50 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
11a60 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
11a70 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
11a80 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
11a90 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
11aa0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
11ab0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
11ac0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11ad0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
11ae0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
11af0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
11b00 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
11b10 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11b20 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
11b30 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
11b40 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
11b50 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
11b60 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
11b70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
11b80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
11b90 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
11ba0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11bb0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
11bc0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
11bd0 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
11be0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11bf0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
11c00 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
11c10 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
11c20 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
11c30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11c40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
11c50 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
11c60 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65 73  age:         tes
11c70 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f  t_errstr <err co
11c80 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  de>.**.** Test t
11c90 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20  hat the english 
11ca0 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20  language string 
11cb0 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20  equivalents for 
11cc0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
11cd0 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20  es.** are sane. 
11ce0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  The parameter is
11cf0 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
11d00 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69  esenting an sqli
11d10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
11d20 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
11d30 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c  a list of two el
11d40 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69  ements, the stri
11d50 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
11d60 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  n of the.** erro
11d70 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65  r code and the e
11d80 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
11d90 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  explanation..*/.
11da0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
11db0 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  errstr(.  void *
11dc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11dd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11de0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11df0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11e00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
11e10 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69   *zCode;.  int i
11e20 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
11e30 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11e40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11e50 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72  1, objv, "<error
11e60 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20   code>");.  }.. 
11e70 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74   zCode = Tcl_Get
11e80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
11e90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
11ea0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
11eb0 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72   0==strcmp(t1Err
11ec0 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65  orName(i), zCode
11ed0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
11ee0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
11ef0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
11f00 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c  qlite3ErrStr(i),
11f10 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
11f20 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11f30 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f  sage:    breakpo
11f40 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  int.**.** This r
11f50 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f  outine exists fo
11f60 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20  r one purpose - 
11f70 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61  to provide a pla
11f80 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62  ce to put a.** b
11f90 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47  reakpoint with G
11fa0 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74  DB that can be t
11fb0 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54  riggered using T
11fc0 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73  CL code.  The us
11fd0 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73  e.** for this is
11fe0 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c   when a particul
11ff0 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e  ar test fails on
12000 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74   (say) the 1485t
12010 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  h iteration..** 
12020 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20  In the TCL test 
12030 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61  script, we can a
12040 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  dd code like thi
12050 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20  s:.**.**     if 
12060 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b  {$i==1485} break
12070 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  point.**.** Then
12080 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65   run testfixture
12090 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
120a0 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68   and wait for th
120b0 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a  e breakpoint to.
120c0 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61  ** fire.  Then a
120d0 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70  dditional breakp
120e0 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74  oints can be set
120f0 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74   to trace down t
12100 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69  he bug..*/.stati
12110 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b  c int test_break
12120 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e  point(.  void *N
12130 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
12140 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
12150 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
12160 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
12170 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
12180 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
121b0 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
121c0 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
121d0 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
121e0 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
121f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12200 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
12210 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  othing */.}../*.
12220 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
12230 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
12240 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a  b  STMT IDX N.**
12250 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
12260 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
12270 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
12280 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
12290 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
122a0 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
122b0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
122c0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
122d0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
122e0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
122f0 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
12300 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
12310 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
12320 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
12330 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20  ind_zeroblob(.  
12340 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12350 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12360 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12370 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12380 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12390 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
123a0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
123b0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
123c0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
123d0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
123e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
123f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
12400 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20  MT IDX N");.    
12410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12420 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
12430 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
12440 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12450 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
12460 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
12470 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
12480 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12490 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
124a0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
124b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
124c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
124d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
124e0 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e  3], &n) ) return
124f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12500 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12510 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c  _zeroblob(pStmt,
12520 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20   idx, n);.  if( 
12530 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
12540 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
12550 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
12560 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12570 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
12580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12590 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
125a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
125b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
125c0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
125d0 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20  _bind_int  STMT 
125e0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
125f0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
12600 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63  ind_int interfac
12610 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
12620 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12630 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
12640 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
12650 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
12660 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
12670 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
12680 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nds a 32-bit int
12690 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
126a0 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
126b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
126c0 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64  bind_int(.  void
126d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
126e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
126f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
12700 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
12710 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
12720 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
12730 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
12740 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  int value;.  int
12750 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
12760 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
12770 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12780 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12790 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
127a0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
127b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
127c0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
127d0 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
127e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
127f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
12800 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
12810 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12820 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12830 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
12840 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
12850 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
12860 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12870 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
12880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12890 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
128a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
128b0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
128c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
128d0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
128e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
128f0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
12900 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
12910 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
12920 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
12930 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
12940 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
12950 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
12970 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
12980 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
12990 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
129a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
129b0 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c  nt64  STMT N VAL
129c0 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
129d0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  e sqlite3_bind_i
129e0 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20  nt64 interface. 
129f0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
12a00 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
12a10 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
12a20 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
12a30 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
12a40 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
12a50 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
12a60 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
12a70 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
12a80 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
12a90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
12aa0 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  d_int64(.  void 
12ab0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12ac0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12ad0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12ae0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12af0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
12b00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
12b10 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
12b20 36 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  64 value;.  int 
12b30 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12b40 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
12b50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12b60 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12b70 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12b80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
12b90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12ba0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
12bb0 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
12bc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12bd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
12be0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
12bf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
12c00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
12c10 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
12c20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
12c30 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
12c40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12c50 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
12c60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12c70 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65   if( Tcl_GetWide
12c80 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12c90 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
12ca0 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ue) ) return TCL
12cb0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
12cc0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12cd0 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  64(pStmt, idx, v
12ce0 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
12cf0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
12d00 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
12d10 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
12d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12d30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
12d50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12d60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
12d70 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
12d80 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
12d90 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54  ind_double  STMT
12da0 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
12db0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
12dc0 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65  bind_double inte
12dd0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
12de0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
12df0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
12e00 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
12e10 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
12e20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12e30 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
12e40 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
12e50 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
12e60 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
12e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12e80 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  est_bind_double(
12e90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12ea0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12eb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12ec0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12ed0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12ee0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12ef0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12f00 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61  idx;.  double va
12f10 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  lue;.  int rc;. 
12f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
12f30 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  l;.  int i;.  st
12f40 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
12f50 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
12f60 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
12f70 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70  * Name of the sp
12f80 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70  ecial floating p
12f90 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  oint value */.  
12fa0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
12fb0 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65  Upper;   /* Uppe
12fc0 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20  r 32 bits */.   
12fd0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c   unsigned int iL
12fe0 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72  ower;   /* Lower
12ff0 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20   32 bits */.  } 
13000 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b  aSpecialFp[] = {
13010 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20  .    {  "NaN",  
13020 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20      0x7fffffff, 
13030 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
13040 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20    {  "SNaN",    
13050 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66   0x7ff7ffff, 0xf
13060 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
13070 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78    "-NaN",     0x
13080 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  ffffffff, 0xffff
13090 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
130a0 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66  -SNaN",    0xfff
130b0 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
130c0 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e  f },.    {  "+In
130d0 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30  f",     0x7ff000
130e0 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
130f0 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c  ,.    {  "-Inf",
13100 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c       0xfff00000,
13110 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
13120 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c     {  "Epsilon",
13130 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78    0x00000000, 0x
13140 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20  00000001 },.    
13150 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30  {  "-Epsilon", 0
13160 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x80000000, 0x000
13170 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
13180 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66  "NaN0",     0x7f
13190 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f80000, 0x000000
131a0 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e  00 },.    {  "-N
131b0 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30  aN0",    0xfff80
131c0 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
131d0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
131e0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
131f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13200 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
13210 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13220 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13230 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13240 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
13250 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
13260 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
13270 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
13280 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
13290 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
132a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
132b0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
132c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
132d0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
132e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
132f0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
13300 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13310 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65  R;..  /* Interce
13320 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e  pt the string "N
13330 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65  aN" and generate
13340 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72   a NaN value for
13350 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74   it..  ** All ot
13360 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20  her strings are 
13370 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
13380 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  o Tcl_GetDoubleF
13390 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54  romObj()..  ** T
133a0 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
133b0 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64  Obj() should und
133c0 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75  erstand "NaN" bu
133d0 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a  t some versions.
133e0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62    ** contain a b
133f0 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20  ug..  */.  zVal 
13400 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
13410 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28  objv[3]);.  for(
13420 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
13430 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
13440 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b  (aSpecialFp[0]);
13450 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
13460 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70  trcmp(aSpecialFp
13470 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29  [i].zName, zVal)
13480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
13490 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20  ite3_uint64 x;. 
134a0 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61       x = aSpecia
134b0 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20  lFp[i].iUpper;. 
134c0 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20       x <<= 32;. 
134d0 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69       x |= aSpeci
134e0 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a  alFp[i].iLower;.
134f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
13500 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29  zeof(value)==8 )
13510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13520 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a  sizeof(x)==8 );.
13530 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61        memcpy(&va
13540 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20  lue, &x, 8);.   
13550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13560 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
13570 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
13580 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
13590 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20  p[0]) &&.       
135a0 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
135b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
135c0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
135d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
135e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
135f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
13600 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
13610 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
13620 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
13630 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
13640 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
13650 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13660 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
13670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13690 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
136a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
136b0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
136c0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
136d0 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
136e0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
136f0 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
13700 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
13710 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
13720 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
13730 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
13740 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
13750 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
13760 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
13770 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
13780 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
13790 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
137a0 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a  d_null(.  void *
137b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
137c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
137d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
137e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
137f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13800 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13810 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
13820 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
13830 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
13840 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13850 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
13860 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13870 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
13880 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13890 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
138a0 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20  TMT N", 0);.    
138b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
138c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
138d0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
138e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
138f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
13900 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
13910 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
13920 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13930 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
13940 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
13950 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
13960 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
13970 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
13980 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
13990 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
139a0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
139b0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
139c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
139d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
139e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
139f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
13a00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
13a10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
13a20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13a30 78 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  xt  STMT N STRIN
13a40 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
13a50 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
13a60 69 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61  ind_text interfa
13a70 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
13a80 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
13a90 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
13aa0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
13ab0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
13ac0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
13ad0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
13ae0 69 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72  inds a UTF-8 str
13af0 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
13b00 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
13b10 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
13b20 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
13b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
13b40 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20  st_bind_text(.  
13b50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13b60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13b70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13b80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13b90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13ba0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
13bb0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
13bc0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
13bd0 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
13be0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
13bf0 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
13c00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13c10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
13c20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13c30 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13c40 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13c50 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
13c60 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
13c70 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
13c80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13c90 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
13ca0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
13cb0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13cc0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
13cd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13ce0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
13cf0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13d00 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
13d10 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
13d20 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
13d30 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
13d40 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
13d50 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  j(objv[3], &byte
13d60 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  s);.  if( Tcl_Ge
13d70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13d80 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
13d90 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
13da0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
13db0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13dc0 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  xt(pStmt, idx, v
13dd0 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c  alue, bytes, SQL
13de0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
13df0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13e00 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13e10 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
13e20 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13e30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13e50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
13e60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
13e70 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
13e80 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
13e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13ea0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13eb0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
13ec0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
13ed0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d  3_bind_text16 ?-
13ee0 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53  static? STMT N S
13ef0 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
13f00 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
13f10 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69  e3_bind_text16 i
13f20 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
13f30 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
13f40 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
13f50 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
13f60 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
13f70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
13f80 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
13f90 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
13fa0 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e  -16 string STRIN
13fb0 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
13fc0 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
13fd0 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
13fe0 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
13ff0 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
14000 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  ext16(.  void * 
14010 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14020 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14030 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14040 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14050 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
14060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
14070 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
14080 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
14090 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
140a0 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
140b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f  .  int rc;..  vo
140c0 69 64 20 28 2a 78 44 65 6c 29 28 29 20 3d 20 28  id (*xDel)() = (
140d0 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53  objc==6?SQLITE_S
140e0 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41  TATIC:SQLITE_TRA
140f0 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f  NSIENT);.  Tcl_O
14100 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f  bj *oStmt    = o
14110 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54  bjv[objc-4];.  T
14120 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20  cl_Obj *oN      
14130 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b   = objv[objc-3];
14140 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72  .  Tcl_Obj *oStr
14150 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  ing  = objv[objc
14160 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -2];.  Tcl_Obj *
14170 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b  oBytes   = objv[
14180 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20  objc-1];..  if( 
14190 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
141a0 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  =6){.    Tcl_App
141b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
141c0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
141d0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
141e0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
141f0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
14200 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
14210 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
14220 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
14230 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
14240 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
14250 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
14260 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74  _GetString(oStmt
14270 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
14280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14290 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
142a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
142b0 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  N, &idx) ) retur
142c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
142d0 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63  alue = (char*)Tc
142e0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
142f0 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30  omObj(oString, 0
14300 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
14310 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14320 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65  p, oBytes, &byte
14330 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
14340 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
14350 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
14360 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28  16(pStmt, idx, (
14370 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79  void *)value, by
14380 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66  tes, xDel);.  if
14390 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
143a0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
143b0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
143c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
143d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
143e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14400 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f  R;.  }..#endif /
14410 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
14420 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
14430 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14440 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14450 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74  3_bind_blob ?-st
14460 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54  atic? STMT N DAT
14470 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  A BYTES.**.** Te
14480 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
14490 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61  ind_blob interfa
144a0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
144b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
144c0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
144d0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
144e0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
144f0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
14500 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
14510 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74  inds a BLOB to t
14520 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
14530 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20  e BLOB is BYTES 
14540 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
14550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14560 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76  t_bind_blob(.  v
14570 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14580 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14590 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
145a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
145b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
145c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
145d0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
145e0 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
145f0 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
14600 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
14610 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65  _destructor_type
14620 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
14630 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b  QLITE_TRANSIENT;
14640 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
14650 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20  && objc!=6 ){.  
14660 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14670 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
14680 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
14690 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
146a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
146b0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
146c0 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41  ), " STMT N DATA
146d0 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
146e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
146f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
14700 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65  jc==6 ){.    xDe
14710 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54  structor = SQLIT
14720 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62  E_STATIC;.    ob
14730 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  jv++;.  }..  if(
14740 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
14750 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14760 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14770 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
14780 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
14790 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
147a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
147b0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
147c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
147d0 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
147e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
147f0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
14800 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14810 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
14820 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14830 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
14840 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
14850 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
14860 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74 72  e, bytes, xDestr
14870 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71  uctor);.  if( sq
14880 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
14890 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
148a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
148b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
148c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
148d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
148e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
148f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14910 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14920 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
14930 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  unt  STMT.**.** 
14940 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14950 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69  r of wildcards i
14960 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74  n the given stat
14970 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
14980 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
14990 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a  arameter_count(.
149a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
149b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
149c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
149d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
149e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
149f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14a00 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
14a10 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
14a20 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14a30 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
14a40 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
14a50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14a60 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
14a70 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
14a80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14a90 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
14aa0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14ab0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
14ac0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
14ad0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
14ae0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
14af0 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
14b00 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
14b10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
14b20 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
14b30 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
14b40 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a  ame  STMT  N.**.
14b50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
14b60 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69  me of the Nth wi
14b70 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72  ldcard.  The fir
14b80 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31  st wildcard is 1
14b90 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74  ..** An empty st
14ba0 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
14bb0 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
14bc0 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20  range or if the 
14bd0 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e  wildcard.** is n
14be0 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  ameless..*/.stat
14bf0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
14c00 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
14c10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
14c20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
14c30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
14c40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
14c50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
14c60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
14c70 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
14c80 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
14c90 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
14ca0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14cb0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
14cc0 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
14cd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
14ce0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
14cf0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
14d00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14d10 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
14d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14d30 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
14d40 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14d50 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20   objv[2], &i) ) 
14d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14d70 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
14d80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
14d90 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
14da0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64  Obj(sqlite3_bind
14db0 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
14dc0 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29  pStmt,i),-1).  )
14dd0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
14de0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
14df0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
14e00 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
14e10 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a  x  STMT  NAME.**
14e20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
14e30 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64  ndex of the wild
14e40 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45  card called NAME
14e50 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
14e60 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75  here is.** no su
14e70 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  ch wildcard..*/.
14e80 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
14e90 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
14ea0 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63  ndex(.  void * c
14eb0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14ec0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14ed0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14ee0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14ef0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
14f00 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
14f10 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
14f20 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
14f30 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
14f40 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d   objv, "STMT NAM
14f50 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
14f60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
14f70 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
14f80 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14f90 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14fa0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
14fb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14fc0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
14fd0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
14fe0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a   Tcl_NewIntObj(.
14ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
15000 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
15010 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65  dex(pStmt,Tcl_Ge
15020 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
15030 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20  ).     ).  );.  
15040 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15050 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15060 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
15070 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a  indings STMT.**.
15080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15090 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  st_clear_binding
150a0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
150b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
150c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
150d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
150e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
150f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
15100 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
15110 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
15120 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15130 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
15140 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
15150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15160 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
15170 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
15180 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15190 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
151a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
151b0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
151c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
151d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
151e0 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  (sqlite3_clear_b
151f0 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29  indings(pStmt)))
15200 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
15210 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
15220 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65  e:   sqlite3_sle
15230 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a  ep MILLISECONDS.
15240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15250 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64  st_sleep(.  void
15260 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15270 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15280 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15290 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
152a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
152b0 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t ms;..  if( obj
152c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
152d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
152e0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 1, objv, "M
152f0 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
15300 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15310 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
15320 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15330 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
15340 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65  , &ms) ){.    re
15350 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15360 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
15370 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
15380 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
15390 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29  ite3_sleep(ms)))
153a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
153b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
153c0 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  e: sqlite3_errco
153d0 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
153e0 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
153f0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
15400 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
15410 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
15420 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
15430 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
15440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15450 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20  test_errcode(.  
15460 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15470 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15480 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15490 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
154a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
154b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
154c0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
154d0 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[30];..  if(
154e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
154f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15500 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15510 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15520 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
15530 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15540 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
15550 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15560 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
15570 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
15580 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15590 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
155a0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
155b0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
155c0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
155d0 62 29 3b 0a 20 20 69 66 28 20 28 72 63 26 30 78  b);.  if( (rc&0x
155e0 66 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20 20 7a  ff)==rc ){.    z
155f0 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65  Buf[0] = 0;.  }e
15600 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
15610 28 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72 63 3e  (zBuf,"+%d", rc>
15620 3e 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  >8);.  }.  Tcl_A
15630 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15640 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
15650 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a 42 75  rorName(rc), zBu
15660 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
15670 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15680 20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65   Usage:   test_e
15690 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rrmsg DB.**.** R
156a0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38  eturns the UTF-8
156b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
156c0 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
156d0 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
156e0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
156f0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
15700 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
15710 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
15720 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15730 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15740 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15750 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15760 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15770 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15780 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
15790 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62  *zErr;..  if( ob
157a0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
157b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
157c0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
157d0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
157e0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
157f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
15800 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
15810 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15820 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
15830 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
15840 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15850 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
15860 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15870 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
15880 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
15890 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
158a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
158b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
158c0 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  Err, -1));.  ret
158d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
158e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
158f0 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a  st_errmsg16 DB.*
15900 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
15910 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e   UTF-16 represen
15920 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
15930 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
15940 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
15950 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
15960 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68  3_* API call. Th
15970 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72  is is a byte arr
15980 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ay object at the
15990 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20   TCL .** level, 
159a0 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20  and it includes 
159b0 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65  the 0x00 0x00 te
159c0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61  rminator bytes a
159d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
159e0 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e  .** UTF-16 strin
159f0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15a00 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
15a10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15a20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15a30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15a40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15a50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15a60 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15a70 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
15a80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15a90 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
15aa0 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a   int bytes = 0;.
15ab0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
15ac0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
15ad0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
15ae0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
15af0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
15b00 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
15b10 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
15b20 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
15b30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b40 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
15b50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15b60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15b70 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
15b80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
15b90 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
15ba0 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20  errmsg16(db);.  
15bb0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
15bc0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 55  bytes = sqlite3U
15bd0 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45 72 72  tf16ByteLen(zErr
15be0 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  , -1);.  }.  Tcl
15bf0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
15c00 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
15c10 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20  eArrayObj(zErr, 
15c20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20  bytes));.#endif 
15c30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
15c40 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
15c50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
15c60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
15c70 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20  _prepare DB sql 
15c80 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
15c90 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
15ca0 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
15cb0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
15cc0 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
15cd0 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
15ce0 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
15cf0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
15d00 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
15d10 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
15d20 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
15d30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
15d40 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
15d50 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
15d60 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
15d70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
15d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15d90 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69  t_prepare(.  voi
15da0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15db0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15dc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15dd0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15de0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15df0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
15e00 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
15e10 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
15e20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
15e30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
15e40 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
15e50 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
15e60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15e70 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
15e80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15e90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15ea0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15eb0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
15ec0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15ed0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
15ee0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
15ef0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15f10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
15f20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15f30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15f40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
15f50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
15f60 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
15f70 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
15f80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15f90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15fa0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
15fb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15fc0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15fd0 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
15fe0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
15ff0 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66  t, &zTail);.  if
16000 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16010 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
16020 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16030 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a  L_ERROR;.  if( z
16040 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Tail ){.    if( 
16050 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
16060 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
16070 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a  - (zTail-zSql);.
16080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
16090 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65  rlen(zTail)<byte
160a0 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  s ){.      bytes
160b0 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29   = strlen(zTail)
160c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
160d0 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
160e0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
160f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16100 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
16110 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
16120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16130 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
16140 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
16150 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
16160 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
16170 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16180 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
16190 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
161a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
161b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
161c0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
161d0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
161e0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
161f0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
16200 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16210 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
16220 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16230 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
16240 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16260 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
16270 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  e_v2 DB sql byte
16280 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
16290 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
162a0 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
162b0 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
162c0 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
162d0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
162e0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
162f0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
16300 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
16310 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
16320 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
16330 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
16340 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
16350 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
16360 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
16370 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16380 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
16390 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
163a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
163b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
163c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
163d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
163e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
163f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
16400 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
16410 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
16420 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
16430 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
16440 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
16450 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
16460 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
16470 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
16480 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16490 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
164a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
164b0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
164c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
164d0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
164e0 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
164f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
16510 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
16520 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16530 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16540 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
16550 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
16560 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
16570 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
16580 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16590 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
165a0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
165b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
165c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
165d0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
165e0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
165f0 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
16600 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
16610 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
16620 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
16630 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
16640 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
16650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16660 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
16670 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
16680 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
16690 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
166a0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
166b0 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
166c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
166d0 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
166e0 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
166f0 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
16700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16710 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16720 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
16730 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
16740 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
16750 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16760 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
16770 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
16780 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
167a0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
167b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
167c0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
167d0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
167e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
167f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
16800 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16810 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
16820 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
16830 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16840 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
16850 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44  repare_tkt3134 D
16860 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  B.**.** Generate
16870 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
16880 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f  ement for a zero
16890 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73 20  -byte string as 
168a0 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69  a test.** for ti
168b0 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68 65  cket #3134.  The
168c0 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62   string should b
168d0 65 20 70 72 65 63 65 65 64 65 64 20 62 79 20 61  e preceeded by a
168e0 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73   zero byte..*/.s
168f0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
16900 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a  repare_tkt3134(.
16910 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16920 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16930 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16940 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16950 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16960 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16970 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
16980 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c  char zSql[] = "\
16990 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20  000SELECT 1";.  
169a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
169b0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
169c0 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
169d0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
169e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
169f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16a00 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16a10 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16a20 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
16a30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
16a40 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
16a50 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
16a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16a70 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
16a80 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
16a90 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16aa0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
16ab0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16ac0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
16ad0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
16ae0 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26  , &zSql[1], 0, &
16af0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73  pStmt, 0);.  ass
16b00 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
16b10 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
16b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
16b30 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
16b40 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
16b50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16b60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16b70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16b80 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
16b90 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
16ba0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
16bb0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16bc0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
16bd0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
16be0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
16bf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16c00 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
16c10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16c20 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
16c30 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
16c40 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
16c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16c60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16c70 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
16c80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16c90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16ca0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
16cb0 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c  prepare16 DB sql
16cc0 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
16cd0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
16ce0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
16cf0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
16d00 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
16d10 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
16d20 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
16d30 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
16d40 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
16d50 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
16d60 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
16d70 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
16d80 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
16d90 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
16da0 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
16db0 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
16dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
16dd0 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20  st_prepare16(.  
16de0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16df0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16e00 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16e10 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16e20 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16e30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16e40 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
16e50 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
16e60 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
16e70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
16e80 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
16e90 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
16ea0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16eb0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
16ec0 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
16ed0 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ef0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
16f00 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
16f10 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
16f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f30 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
16f40 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
16f50 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
16f60 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
16f70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16f80 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16f90 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16fa0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
16fb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
16fc0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
16fd0 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
16fe0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16ff0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
17000 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
17010 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17020 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
17030 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17040 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
17050 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
17060 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
17070 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
17080 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17090 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
170a0 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
170b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
170c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
170d0 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c  epare16(db, zSql
170e0 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
170f0 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20   &zTail);.  if( 
17100 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17110 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
17120 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
17130 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
17140 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
17150 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17160 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
17170 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
17180 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d   - ((u8 *)zTail-
17190 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d  (u8 *)zSql);.  }
171a0 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  else{.    objlen
171b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69   = 0;.  }.  pTai
171c0 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
171d0 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
171e0 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
171f0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
17200 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f  (pTail);.  Tcl_O
17210 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
17220 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
17230 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ail, 0);.  Tcl_D
17240 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
17250 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  l);..  if( pStmt
17260 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
17270 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
17280 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
17290 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
172a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
172b0 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
172c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
172d0 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
172e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
172f0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
17300 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17310 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
17320 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20  prepare16_v2 DB 
17330 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
17340 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  r.**.** Compile 
17350 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
17360 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
17370 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
17380 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
17390 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
173a0 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
173b0 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
173c0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
173d0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
173e0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
173f0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
17400 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
17410 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
17420 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
17430 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17440 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
17450 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
17460 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17480 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17490 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
174a0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
174b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
174c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
174d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
174e0 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
174f0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
17500 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
17510 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17520 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
17530 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
17540 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
17550 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
17560 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
17570 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
17580 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
17590 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
175a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
175b0 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
175c0 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
175d0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
175e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
175f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
17600 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
17610 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
17620 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17630 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
17640 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
17650 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
17670 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
17680 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17690 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
176a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
176b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
176c0 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
176d0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
176e0 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
176f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17700 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17710 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
17720 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17730 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17740 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
17750 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
17760 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
17770 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17780 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
17790 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
177a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
177b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
177c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
177d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61  ;.  }..  if( zTa
177e0 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  il ){.    objlen
177f0 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38   = objlen - ((u8
17800 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
17810 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sql);.  }else{. 
17820 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
17830 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c   }.  pTail = Tcl
17840 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
17850 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
17860 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  jlen);.  Tcl_Inc
17870 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
17880 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61  ;.  Tcl_ObjSetVa
17890 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
178a0 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
178b0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
178c0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20  ount(pTail);..  
178d0 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
178e0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
178f0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
17900 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
17910 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17920 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
17930 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17940 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
17950 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17960 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
17970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17990 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69   sqlite3_open fi
179a0 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d  lename ?options-
179b0 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  list?.*/.static 
179c0 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20  int test_open(. 
179d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
179e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
179f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17a00 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17a10 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17a20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17a30 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
17a40 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
17a50 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
17a60 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
17a70 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26  !=3 && objc!=2 &
17a80 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
17a90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17aa0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
17ab0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
17ac0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
17ad0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17ae0 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
17af0 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
17b00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
17b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17b20 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f  .  zFilename = o
17b30 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53  bjc>1 ? Tcl_GetS
17b40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a  tring(objv[1]) :
17b50 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
17b60 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  e3_open(zFilenam
17b70 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
17b80 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
17b90 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
17ba0 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
17bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17bc0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
17bd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
17be0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
17bf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17c00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
17c10 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
17c20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
17c30 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31  c int test_open1
17c40 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
17c50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17c60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17c70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17c80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17c90 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
17ca0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17cb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
17cc0 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
17cd0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
17ce0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
17cf0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
17d00 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
17d10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17d20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
17d30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
17d40 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
17d50 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
17d60 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
17d70 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
17d80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17d90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
17da0 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
17db0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
17dc0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63  bjv[1], 0);.  rc
17dd0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31   = sqlite3_open1
17de0 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
17df0 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
17e00 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
17e10 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
17e20 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
17e30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
17e40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17e50 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
17e60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17e70 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
17e80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17ea0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
17eb0 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69  e16 <UTF-16 stri
17ec0 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ng>.**.** Return
17ed0 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69   1 if the suppli
17ee0 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ed argument is a
17ef0 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
17f00 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f  atement, or zero
17f10 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
17f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17f30 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20  t_complete16(.  
17f40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17f50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17f60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17f70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17f80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17f90 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17fa0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
17fb0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
17fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17fd0 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ).  char *zBuf;.
17fe0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
17ff0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
18000 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
18010 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36  , objv, "<utf-16
18020 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74   sql>");.    ret
18030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18040 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68   }..  zBuf = (ch
18050 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
18060 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
18070 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  [1], 0);.  Tcl_S
18080 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18090 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
180a0 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  j(sqlite3_comple
180b0 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65  te16(zBuf)));.#e
180c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
180d0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20  MIT_COMPLETE && 
180e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
180f0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
18100 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18110 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
18120 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
18130 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
18140 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
18150 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
18160 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20  nt test_step(.  
18170 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18180 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18190 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
181a0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
181b0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
181c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
181d0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
181e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
181f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
18200 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18210 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18220 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
18230 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
18240 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
18250 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
18260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18270 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
18280 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18290 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
182a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
182b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
182c0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
182d0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
182e0 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21  );..  /* if( rc!
182f0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
18300 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
18310 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18320 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52  R; */.  Tcl_SetR
18330 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
18340 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
18350 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
18360 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18370 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18380 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
18390 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
183a0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
183b0 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
183c0 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
183d0 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
183e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
183f0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20  _column_count(. 
18400 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18410 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18420 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18430 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18440 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18450 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18460 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
18470 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18480 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18490 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
184a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
184b0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
184c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
184d0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
184e0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
184f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18500 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
18510 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18520 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18530 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18540 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18550 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  ROR;..  Tcl_SetO
18560 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18570 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
18580 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
18590 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  unt(pStmt)));.  
185a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
185b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
185c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
185d0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
185e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
185f0 74 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61  type of the data
18600 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
18610 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
18620 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  nt row..*/.stati
18630 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
18640 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  n_type(.  void *
18650 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18660 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18670 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18680 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18690 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
186a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
186b0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
186c0 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t tp;..  if( obj
186d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
186e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
186f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18700 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18710 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18720 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18730 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
18740 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18750 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18760 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
18770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18790 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
187a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
187b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
187c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
187d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
187e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
187f0 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71  RROR;..  tp = sq
18800 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
18810 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  e(pStmt, col);. 
18820 20 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20   switch( tp ){. 
18830 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
18840 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54  NTEGER: .      T
18850 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
18860 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20  erp, "INTEGER", 
18870 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
18880 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18890 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
188a0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
188b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55  sult(interp, "NU
188c0 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  LL", TCL_STATIC)
188d0 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
188e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
188f0 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c  FLOAT:.      Tcl
18900 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
18910 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f  p, "FLOAT", TCL_
18920 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
18930 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18940 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20  SQLITE_TEXT:.   
18950 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
18960 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c  (interp, "TEXT",
18970 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
18980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18990 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
189a0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
189b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42  esult(interp, "B
189c0 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  LOB", TCL_STATIC
189d0 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
189e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
189f0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
18a00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
18a10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18a20 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
18a30 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63  umn_int64 STMT c
18a40 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
18a50 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  rn the data in c
18a60 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
18a70 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
18a80 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20  w cast as an.** 
18a90 77 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e  wide (64-bit) in
18aa0 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
18ab0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
18ac0 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
18ad0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18ae0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18af0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18b00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18b10 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18b20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18b30 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36  .  int col;.  i6
18b40 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  4 iVal;..  if( o
18b50 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
18b60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18b70 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18b80 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18b90 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18ba0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18bb0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
18bc0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
18bd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18be0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
18bf0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18c00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18c10 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18c20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18c30 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
18c40 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18c50 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
18c60 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
18c70 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20  _ERROR;..  iVal 
18c80 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
18c90 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f  _int64(pStmt, co
18ca0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
18cb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18cc0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
18cd0 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  (iVal));.  retur
18ce0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18cf0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18d00 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54  3_column_blob ST
18d10 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
18d20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
18d30 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  umn_blob(.  void
18d40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18d50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18d60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18d70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18d80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18d90 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18da0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20  t;.  int col;.. 
18db0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73   int len;.  cons
18dc0 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a  t void *pBlob;..
18dd0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
18de0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18df0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18e00 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18e10 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18e20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18e30 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
18e40 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
18e50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18e60 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
18e70 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18e80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18e90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18ea0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18eb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18ec0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18ed0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18ee0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
18ef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18f00 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
18f10 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
18f20 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f  mt, col);.  pBlo
18f30 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
18f40 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63  mn_blob(pStmt, c
18f50 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
18f60 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18f70 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
18f80 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29  Obj(pBlob, len))
18f90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18fa0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18fb0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
18fc0 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f  n_double STMT co
18fd0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
18fe0 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
18ff0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
19000 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19010 20 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c   cast as a doubl
19020 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19030 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
19040 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
19050 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19060 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19070 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19080 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19090 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
190a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
190b0 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c  int col;.  doubl
190c0 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  e rVal;..  if( o
190d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
190e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
190f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19100 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
19110 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
19120 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19130 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
19140 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
19150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19160 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19170 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19180 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19190 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
191a0 20 29 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 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
191c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
191d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
191e0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
191f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20  _ERROR;..  rVal 
19200 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
19210 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63  _double(pStmt, c
19220 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
19230 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
19240 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
19250 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  (rVal));.  retur
19260 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19270 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19280 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d  3_data_count STM
19290 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
192a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
192b0 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
192c0 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
192d0 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
192e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74  tic int test_dat
192f0 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  a_count(.  void 
19300 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
19310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
19330 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
19340 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
19350 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19360 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
19370 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
19380 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19390 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
193a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
193b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
193c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
193d0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
193e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
193f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
19400 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
19410 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19420 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19430 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
19440 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
19450 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19460 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19470 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
19480 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d  _data_count(pStm
19490 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
194a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
194b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
194c0 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
194d0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
194e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
194f0 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
19500 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
19510 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19520 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
19530 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
19540 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  nt test_stmt_utf
19550 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  8(.  void * clie
19560 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f  ntData,        /
19570 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
19580 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
19590 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f   to be invoke */
195a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
195b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
195c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
195d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
195e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
195f0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
19600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a    const char *(*
19610 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
19620 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69  tmt*, int) = cli
19630 65 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  entData;.  const
19640 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
19650 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
19660 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19670 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19680 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19690 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
196a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
196b0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
196c0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
196d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
196e0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
196f0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19700 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19710 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19720 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19740 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
19750 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
19760 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
19770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19780 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  Ret = xFunc(pStm
19790 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
197a0 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ret ){.    Tcl_S
197b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
197c0 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30   (char *)zRet, 0
197d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
197e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
197f0 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61  c int test_globa
19800 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69  l_recover(.  voi
19810 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19820 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19830 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19840 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19850 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
19860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19870 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20  _GLOBALRECOVER. 
19880 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
19890 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
198a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
198b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
198c0 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
198d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
198e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c   rc = sqlite3_gl
198f0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a  obal_recover();.
19900 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
19910 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
19920 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
19930 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65   TCL_STATIC);.#e
19940 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
19950 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19960 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19970 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
19980 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
19990 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
199a0 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
199b0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
199c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
199d0 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
199e0 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
199f0 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  t test_stmt_utf1
19a00 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
19a10 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50  ntData,     /* P
19a20 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
19a30 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
19a40 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
19a50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19a60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19a70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19a80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
19a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19aa0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
19ab0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19ac0 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62  nt col;.  Tcl_Ob
19ad0 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74  j *pRet;.  const
19ae0 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a   void *zName16;.
19af0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a    const void *(*
19b00 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
19b10 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69  tmt*, int) = cli
19b20 65 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  entData;..  if( 
19b30 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
19b40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19b50 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19b60 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19b70 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19b80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19b90 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
19ba0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
19bb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19bc0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
19bd0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
19be0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19bf0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
19c00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19c10 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
19c20 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
19c30 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
19c40 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
19c50 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d  L_ERROR;..  zNam
19c60 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  e16 = xFunc(pStm
19c70 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
19c80 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 70 52  Name16 ){.    pR
19c90 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  et = Tcl_NewByte
19ca0 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36  ArrayObj(zName16
19cb0 2c 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  , sqlite3Utf16By
19cc0 74 65 4c 65 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d  teLen(zName16, -
19cd0 31 29 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53  1)+2);.    Tcl_S
19ce0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
19cf0 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23  rp, pRet);.  }.#
19d00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19d10 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20  OMIT_UTF16 */.. 
19d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19d30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19d40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
19d50 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  nt STMT column.*
19d60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19d70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
19d80 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
19d90 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19da0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
19db0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
19dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
19dd0 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76  st_stmt_int(.  v
19de0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19df0 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ,    /* Pointer 
19e00 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
19e10 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
19e20 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
19e30 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19e40 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19e50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19e60 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
19e70 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
19e80 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78  t col;.  int (*x
19e90 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
19ea0 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65  mt*, int) = clie
19eb0 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f  ntData;..  if( o
19ec0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
19ed0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19ee0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19ef0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
19f00 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
19f10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19f20 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
19f30 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
19f40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19f50 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19f60 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19f70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19f80 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19f90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19fa0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19fb0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19fc0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
19fd0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
19fe0 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
19ff0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1a000 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1a010 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  j(xFunc(pStmt, c
1a020 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ol)));.  return 
1a030 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  TCL_OK;.}..#ifnd
1a040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1a050 49 53 4b 49 4f 0a 23 69 66 20 30 0a 2f 2a 0a 2a  ISKIO.#if 0./*.*
1a060 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1a070 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
1a080 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a 2a 2f 0a 73   <filename>.*/.s
1a090 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1a0a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
1a0b0 57 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  Write(.  void * 
1a0c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a0d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a0e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1a0f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1a100 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1a110 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
1a120 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1a130 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42  dummy;.  char zB
1a140 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1a150 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1a160 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a170 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a180 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a190 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a1a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a1b0 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1a1c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a1d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a1e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1a1f0 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
1a200 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a210 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 2c 20  jv[1]), &pFile, 
1a220 26 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72  &dummy);.  if( r
1a230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a240 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1a250 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1a260 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1a270 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1a280 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a290 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1a2a0 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1a2b0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1a2c0 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54 63  uf, pFile);.  Tc
1a2d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1a2e0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1a2f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a310 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  :  sqlite3OsClos
1a320 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a  e <file handle>.
1a330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a340 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  st_sqlite3OsClos
1a350 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1a360 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a370 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a380 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a390 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a3a0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ].){.  sqlite3_f
1a3b0 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e  ile *pFile;.  in
1a3c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1a3d0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1a3e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a3f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a400 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a410 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a420 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a430 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 22  ), " filehandle"
1a440 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a460 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50 6f  .  if( getFilePo
1a470 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1a480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a490 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29 7b  [1]), &pFile) ){
1a4a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a4b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
1a4c0 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  = sqlite3OsClose
1a4d0 28 26 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  (&pFile);.  if( 
1a4e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a4f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1a500 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1a510 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1a520 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1a530 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a540 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
1a550 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a560 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1a570 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65  ite3OsLock <file
1a580 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79   handle> <lockty
1a590 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe>.*/.static in
1a5a0 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
1a5b0 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  Lock(.  void * c
1a5c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a5d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a5e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1a5f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1a600 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1a610 33 5f 66 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a  3_file * pFile;.
1a620 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a630 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1a640 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a650 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a660 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a670 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  e \"", .        
1a680 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a690 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  jv[0]), .       
1a6a0 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53   " filehandle (S
1a6b0 48 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50  HARED|RESERVED|P
1a6c0 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45  ENDING|EXCLUSIVE
1a6d0 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  )", 0);.    retu
1a6e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a6f0 7d 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65  }..  if( getFile
1a700 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a720 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20  jv[1]), &pFile) 
1a730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1a740 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a750 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 53  if( 0==strcmp("S
1a760 48 41 52 45 44 22 2c 20 54 63 6c 5f 47 65 74 53  HARED", Tcl_GetS
1a770 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
1a780 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a790 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
1a7a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
1a7b0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d   }.  else if( 0=
1a7c0 3d 73 74 72 63 6d 70 28 22 52 45 53 45 52 56 45  =strcmp("RESERVE
1a7d0 44 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  D", Tcl_GetStrin
1a7e0 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20  g(objv[2])) ){. 
1a7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a800 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 52 45 53  sLock(pFile, RES
1a810 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  ERVED_LOCK);.  }
1a820 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
1a830 74 72 63 6d 70 28 22 50 45 4e 44 49 4e 47 22 2c  trcmp("PENDING",
1a840 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a850 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
1a860 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1a870 63 6b 28 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  ck(pFile, PENDIN
1a880 47 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65  G_LOCK);.  }.  e
1a890 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  lse if( 0==strcm
1a8a0 70 28 22 45 58 43 4c 55 53 49 56 45 22 2c 20 54  p("EXCLUSIVE", T
1a8b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a8c0 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63  v[2])) ){.    rc
1a8d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1a8e0 28 70 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56  (pFile, EXCLUSIV
1a8f0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 65 6c 73 65  E_LOCK);.  }else
1a900 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a920 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a930 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1a940 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1a950 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20  ing(objv[0]), . 
1a960 20 20 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e         " filehan
1a970 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53 45  dle (SHARED|RESE
1a980 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43  RVED|PENDING|EXC
1a990 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20  LUSIVE)", 0);.  
1a9a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a9b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  OR;.  }..  if( r
1a9c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a9d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1a9e0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1a9f0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1aa00 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1aa10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1aa20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1aa30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1aa40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1aa50 74 65 33 4f 73 55 6e 6c 6f 63 6b 20 3c 66 69 6c  te3OsUnlock <fil
1aa60 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61  e handle>.*/.sta
1aa70 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
1aa80 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 0a 20 20  ite3OsUnlock(.  
1aa90 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1aaa0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1aab0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1aac0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1aad0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1aae0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1aaf0 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63   pFile;.  int rc
1ab00 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1ab10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ab20 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ab30 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ab40 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1ab50 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1ab60 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1ab70 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29   filehandle", 0)
1ab80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ab90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1aba0 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
1abb0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1abc0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1abd0 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
1abe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1abf0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
1ac00 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
1ac10 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
1ac20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac30 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1ac40 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1ac50 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1ac60 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1ac70 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
1ac80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ac90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1aca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1acb0 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
1acc0 69 6c 65 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  ileName.*/.stati
1acd0 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74  c int test_sqlit
1ace0 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
1acf0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ad00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ad10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ad20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1ad30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ad40 0a 29 7b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65  .){.  char zFile
1ad50 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
1ad60 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 72 63  _SIZE];.  int rc
1ad70 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1ad80 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
1ad90 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  zFile);.  if( rc
1ada0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1adb0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1adc0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1add0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1ade0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1adf0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ae00 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
1ae10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ae20 72 70 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20  rp, zFile, 0);. 
1ae30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ae40 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
1ae50 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1ae60 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
1ae70 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45   DB  MAGIC-NUMBE
1ae80 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  R.**.** Set the 
1ae90 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e  db->magic value.
1aea0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1aeb0 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63  o test error rec
1aec0 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  overy logic..*/.
1aed0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1aee0 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76  e_set_magic(.  v
1aef0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1af00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1af10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1af20 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1af30 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1af40 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1af50 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1af60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1af70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1af80 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1af90 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1afa0 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30    " DB MAGIC", 0
1afb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1afc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1afd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1afe0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1aff0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1b000 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1b010 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1b020 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50  "SQLITE_MAGIC_OP
1b030 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  EN")==0 ){.    d
1b040 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1b050 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
1b060 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1b070 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1b080 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29  E_MAGIC_CLOSED")
1b090 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1b0a0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1b0b0 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65  GIC_CLOSED;.  }e
1b0c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1b0d0 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1b0e0 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20  MAGIC_BUSY")==0 
1b0f0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1b100 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1b110 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  BUSY;.  }else if
1b120 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1b130 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1b140 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20  ERROR")==0 ){.  
1b150 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1b160 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
1b170 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63  ;.  }else if( Tc
1b180 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1b190 20 61 72 67 76 5b 32 5d 2c 20 26 64 62 2d 3e 6d   argv[2], &db->m
1b1a0 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74  agic) ){.    ret
1b1b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b1c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1b1d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b1e0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ge:  sqlite3_int
1b1f0 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a  errupt  DB .**.*
1b200 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74  * Trigger an int
1b210 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a  errupt on DB.*/.
1b220 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b230 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
1b240 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b250 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b260 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1b270 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1b280 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1b290 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1b2a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1b2b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b2c0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1b2d0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1b2e0 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
1b2f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b300 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b310 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1b320 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1b330 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1b340 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
1b350 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
1b360 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b370 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
1b380 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
1b390 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
1b3a0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
1b3b0 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
1b3c0 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
1b3d0 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
1b3e0 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
1b3f0 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
1b400 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
1b410 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
1b420 67 42 75 66 29 3b 20 69 2b 2b 29 20 62 69 67 42  gBuf); i++) bigB
1b430 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65  uf[i] = 0xdeadbe
1b440 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ef;.  sqlite3_st
1b450 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28  ack_baseline = (
1b460 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33  u8*)&bigBuf[6553
1b470 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  6];.}../*.** Get
1b480 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1b490 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64 20  ck depth.  Used 
1b4a0 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
1b4b0 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ly..*/.u64 sqlit
1b4c0 65 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69  e3StackDepth(voi
1b4d0 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65  d){.  u8 x;.  re
1b4e0 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74  turn (u64)(sqlit
1b4f0 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1b500 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e - &x);.}../*.*
1b510 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1b520 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20  3_stack_used DB 
1b530 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  SQL.**.** Try to
1b540 20 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f   measure the amo
1b550 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61  unt of stack spa
1b560 63 65 20 75 73 65 64 20 62 79 20 61 20 63 61 6c  ce used by a cal
1b570 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
1b580 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  c.*/.static int 
1b590 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28  test_stack_used(
1b5a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b5b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b5c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b5d0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1b5e0 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1b5f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b  e3 *db;.  int i;
1b600 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1b610 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b620 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b630 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1b640 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1b650 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1b660 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
1b670 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b680 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1b690 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1b6a0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1b6b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b6c0 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b  ROR;.  prepStack
1b6d0 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  ();.  (void)sqli
1b6e0 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67  te3_exec(db, arg
1b6f0 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  v[2], 0, 0, 0);.
1b700 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69    for(i=65535; i
1b710 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73 71  >=0 && ((u32*)sq
1b720 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1b730 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61  line)[-i]==0xdea
1b740 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20  dbeef; i--){}.  
1b750 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1b760 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1b770 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20  IntObj(i*4));.  
1b780 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b790 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b7a0 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e  qlite_delete_fun
1b7b0 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f  ction DB functio
1b7c0 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1b7d0 65 74 65 20 74 68 65 20 75 73 65 72 20 66 75 6e  ete the user fun
1b7e0 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d  ction 'function-
1b7f0 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62  name' from datab
1b800 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49  ase handle DB. I
1b810 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20  t.** is assumed 
1b820 74 68 61 74 20 74 68 65 20 75 73 65 72 20 66 75  that the user fu
1b830 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74  nction was creat
1b840 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20  ed as UTF8, any 
1b850 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67  number of.** arg
1b860 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79 20  uments (the way 
1b870 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1b880 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73  e does it)..*/.s
1b890 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65  tatic int delete
1b8a0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
1b8b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b8c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b8d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1b8e0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1b8f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1b900 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1b910 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1b920 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b930 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1b940 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b950 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1b960 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66   .        " DB f
1b970 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30  unction-name", 0
1b980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b990 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1b9a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1b9b0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1b9c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1b9d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1b9e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1b9f0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67  function(db, arg
1ba00 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[2], -1, SQLITE
1ba10 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20  _UTF8, 0, 0, 0, 
1ba20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  0);.  Tcl_SetRes
1ba30 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1ba40 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1ba50 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
1ba60 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ba70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ba80 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  e: sqlite_delete
1ba90 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f  _collation DB co
1baa0 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a  llation-name.**.
1bab0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f  ** Delete the co
1bac0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1bad0 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65   'collation-name
1bae0 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  ' from database 
1baf0 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49  handle .** DB. I
1bb00 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1bb10 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
1bb20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63 72 65  sequence was cre
1bb30 61 74 65 64 20 61 73 20 55 54 46 38 20 28 74 68  ated as UTF8 (th
1bb40 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43  e .** way the TC
1bb50 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1bb60 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1bb70 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  int delete_colla
1bb80 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1bb90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bba0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bbb0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1bbc0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1bbd0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1bbe0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1bbf0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1bc00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1bc10 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1bc20 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1bc30 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1bc40 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1bc50 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1bc60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bc70 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1bc80 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1bc90 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1bca0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1bcb0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1bcc0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1bcd0 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
1bce0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1bcf0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1bd00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1bd10 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1bd20 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1bd30 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1bd40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1bd50 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74  age: sqlite3_get
1bd60 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a  _autocommit DB.*
1bd70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1bd80 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1bd90 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79   DB is currently
1bda0 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20   in auto-commit 
1bdb0 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  mode..** Return 
1bdc0 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
1bdd0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f  .static int get_
1bde0 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f  autocommit(.  vo
1bdf0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1be00 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1be10 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1be20 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1be30 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  .){.  char zBuf[
1be40 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  30];.  sqlite3 *
1be50 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1be60 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1be70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1be80 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1be90 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1bea0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1beb0 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
1bec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bed0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1bee0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1bef0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1bf00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bf10 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  OR;.  sprintf(zB
1bf20 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65  uf, "%d", sqlite
1bf30 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1bf40 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
1bf50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bf60 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1bf70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bf80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1bf90 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
1bfa0 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65  t DB MS.**.** Se
1bfb0 74 20 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f  t the busy timeo
1bfc0 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ut.  This is mor
1bfd0 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73  e easily done us
1bfe0 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a  ing the timeout.
1bff0 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
1c000 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20   TCL interface. 
1c010 20 42 75 74 20 77 65 20 6e 65 65 64 20 61 20 77   But we need a w
1c020 61 79 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ay to test the c
1c030 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20  ase.** where it 
1c040 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d  returns SQLITE_M
1c050 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  ISUSE..*/.static
1c060 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79 5f 74   int test_busy_t
1c070 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a  imeout(.  void *
1c080 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c090 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c0a0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1c0b0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1c0c0 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20    int rc, ms;.  
1c0d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1c0e0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1c0f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c100 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c110 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c120 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1c130 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22  , .        " DB"
1c140 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c150 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c160 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c170 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1c180 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1c190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1c1a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1c1b0 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
1c1c0 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
1c1d0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1c1e0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
1c1f0 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54  out(db, ms);.  T
1c200 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c210 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54  interp, sqlite3T
1c220 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
1c230 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1c240 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c250 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69  Usage:  tcl_vari
1c260 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42  able_type VARIAB
1c270 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74  LENAME.**.** Ret
1c280 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
1c290 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
1c2a0 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  resentation for 
1c2b0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1c2c0 74 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62  the given variab
1c2d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c2e0 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74  t tcl_variable_t
1c2f0 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
1c300 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c310 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c320 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c330 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c340 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a  v[].){.  Tcl_Obj
1c350 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62   *pVar;.  if( ob
1c360 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1c370 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1c380 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1c390 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20  VARIABLE");.    
1c3a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c3b0 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54  ;.  }.  pVar = T
1c3c0 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
1c3d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c3e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20  ng(objv[1]), 0, 
1c3f0 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53  TCL_LEAVE_ERR_MS
1c400 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d  G);.  if( pVar==
1c410 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
1c420 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72  RROR;.  if( pVar
1c430 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20  ->typePtr ){.   
1c440 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1c450 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1c460 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d  wStringObj(pVar-
1c470 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20  >typePtr->name, 
1c480 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  -1));.  }.  retu
1c490 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c4a0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1c4b0 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
1c4c0 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74  ry ?N?.**.** Att
1c4d0 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
1c4e0 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
1c4f0 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63   held but not ac
1c500 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  tually required.
1c510 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1c520 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1c530 6f 66 20 62 79 74 65 73 20 77 65 20 61 72 65 20  of bytes we are 
1c540 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73  trying to releas
1c550 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75  e.  The .** retu
1c560 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1c570 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
1c580 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73   actually releas
1c590 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c5a0 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d  t test_release_m
1c5b0 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20  emory(.  void * 
1c5c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c5d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c5e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c5f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c600 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66  bjv[].){.#if def
1c610 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1c620 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1c630 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65  MENT) && !define
1c640 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
1c650 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20  SKIO).  int N;. 
1c660 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20   int amt;.  if( 
1c670 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
1c680 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1c690 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1c6a0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f  p, 1, objv, "?N?
1c6b0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1c6c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c6d0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
1c6e0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
1c6f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1c700 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20   objv[1], &N) ) 
1c710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c720 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e  ;.  }else{.    N
1c730 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74   = -1;.  }.  amt
1c740 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61   = sqlite3_relea
1c750 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20  se_memory(N);.  
1c760 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1c770 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1c780 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65  IntObj(amt));.#e
1c790 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1c7a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c7b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
1c7c0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f  oft_heap_limit ?
1c7d0 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f  N?.**.** Query o
1c7e0 72 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68  r set the soft h
1c7f0 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68  eap limit for th
1c800 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
1c810 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20  .  The.** limit 
1c820 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20  is only changed 
1c830 69 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73  if the N is pres
1c840 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f  ent.  The previo
1c850 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72  us limit.** is r
1c860 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c870 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74  ic int test_soft
1c880 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76  _heap_limit(.  v
1c890 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c8a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c8b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c8c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c8d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c8e0 20 73 74 61 74 69 63 20 69 6e 74 20 73 6f 66 74   static int soft
1c8f0 48 65 61 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  HeapLimit = 0;. 
1c900 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20   int amt;.  if( 
1c910 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
1c920 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1c930 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1c940 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f  p, 1, objv, "?N?
1c950 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1c960 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c970 61 6d 74 20 3d 20 73 6f 66 74 48 65 61 70 4c 69  amt = softHeapLi
1c980 6d 69 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d  mit;.  if( objc=
1c990 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 4e 3b  =2 ){.    int N;
1c9a0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
1c9b0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1c9c0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
1c9d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c9e0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
1c9f0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28  soft_heap_limit(
1ca00 4e 29 3b 0a 20 20 20 20 73 6f 66 74 48 65 61 70  N);.    softHeap
1ca10 4c 69 6d 69 74 20 3d 20 4e 3b 0a 20 20 7d 0a 20  Limit = N;.  }. 
1ca20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1ca30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1ca40 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20  wIntObj(amt));. 
1ca50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ca60 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ca70 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
1ca80 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43  _cleanup.**.** C
1ca90 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  all the sqlite3_
1caa0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41  thread_cleanup A
1cab0 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
1cac0 74 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c  t test_thread_cl
1cad0 65 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20  eanup(.  void * 
1cae0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1caf0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cb00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cb10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1cb20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1cb30 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1cb40 70 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  p();.  return TC
1cb50 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1cb60 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1cb70 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
1cb80 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
1cb90 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
1cba0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
1cbb0 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
1cbc0 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
1cbd0 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
1cbe0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1cbf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1cc00 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
1cc10 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
1cc20 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1cc30 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1cc40 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1cc50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1cc60 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
1cc70 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
1cc80 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f  nt v, *a;.  Tcl_
1cc90 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20  Obj *pResult;.. 
1cca0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1ccb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ccc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ccd0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cce0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
1ccf0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cd00 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
1cd10 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
1cd20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cd30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1cd40 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1cd50 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1cd60 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1cd70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cd80 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20  RROR;.  pResult 
1cd90 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
1cda0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1cdb0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1cdc0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1cdd0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  Bt==0 ){.      v
1cde0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
1cdf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ce00 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1ce10 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20  mutex);.      a 
1ce20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1ce30 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
1ce40 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
1ce50 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
1ce60 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71  = a[0];.      sq
1ce70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ce80 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1ce90 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
1cea0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1ceb0 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
1cec0 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
1ced0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
1cee0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
1cef0 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
1cf00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
1cf10 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f  .** tclcmd:   wo
1cf20 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a  rking_64bit_int.
1cf30 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62  **.** Some TCL b
1cf40 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69  uilds (ex: cygwi
1cf50 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  n) do not suppor
1cf60 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  t 64-bit integer
1cf70 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64  s.  This.** lead
1cf80 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66  s to a number of
1cf90 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20   test failures. 
1cfa0 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d   The present com
1cfb0 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a  mand checks the.
1cfc0 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20  ** TCL build to 
1cfd0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1cfe0 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36  ot it supports 6
1cff0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
1d000 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54   It.** returns T
1d010 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61  RUE if it does a
1d020 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
1d030 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
1d040 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77  and is used to w
1d050 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74  arn users that t
1d060 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69  heir TCL build i
1d070 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61  s defective.** a
1d080 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  nd that the erro
1d090 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69  rs they are seei
1d0a0 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ng in the test s
1d0b0 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a  cripts might be.
1d0c0 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  ** a result of t
1d0d0 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54  heir defective T
1d0e0 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  CL rather than p
1d0f0 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74  roblems in SQLit
1d100 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d110 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
1d120 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
1d130 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1d140 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
1d150 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
1d160 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
1d170 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1d180 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1d190 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1d1a0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1d1b0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1d1c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1d1d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1d1e0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1d1f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d200 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1d210 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1d220 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62  Tcl_Obj *pTestOb
1d230 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67  j;.  int working
1d240 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62   = 0;..  pTestOb
1d250 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
1d260 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69  ntObj(1000000*(i
1d270 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a  64)1234567890);.
1d280 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63    working = strc
1d290 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
1d2a0 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33  (pTestObj), "123
1d2b0 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d  4567890000000")=
1d2c0 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  =0;.  Tcl_DecrRe
1d2d0 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29  fCount(pTestObj)
1d2e0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d2f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d300 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77  _NewBooleanObj(w
1d310 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75  orking));.  retu
1d320 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1d330 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
1d340 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a  fs_unlink_test.*
1d350 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
1d360 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72  mmand unregister
1d370 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46  s the primary VF
1d380 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73  S and then regis
1d390 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20  ters.** it back 
1d3a0 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  again.  This is 
1d3b0 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
1d3c0 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69   ability to regi
1d3d0 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68  ster a.** VFS wh
1d3e0 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76  en none are prev
1d3f0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
1d400 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69  d, and the abili
1d410 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69  ty to .** unregi
1d420 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76  ster the only av
1d430 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69  ailable VFS.  Ti
1d440 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74  cket #2738.*/.st
1d450 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c  atic int vfs_unl
1d460 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ink_test(.  Clie
1d470 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1d480 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1d490 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1d4a0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1d4b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d4c0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1d4d0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1d4e0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1d4f0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1d500 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1d510 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d520 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1d530 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d540 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1d550 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1d560 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
1d570 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69  qlite3_vfs *pMai
1d580 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n;.  sqlite3_vfs
1d590 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73   *apVfs[20];.  s
1d5a0 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20  qlite3_vfs one, 
1d5b0 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  two;..  sqlite3_
1d5c0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30  vfs_unregister(0
1d5d0 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  );   /* Unregist
1d5e0 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61  er of NULL is ha
1d5f0 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e  rmless */.  one.
1d600 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
1d610 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22  .  two.zName = "
1d620 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61  __two";..  /* Ca
1d630 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  lling sqlite3_vf
1d640 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
1d650 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  2nd argument of 
1d660 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  0 does not.  ** 
1d670 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  change the defau
1d680 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d  lt VFS.  */.  pM
1d690 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ain = sqlite3_vf
1d6a0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c  s_find(0);.  sql
1d6b0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1d6c0 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73  r(&one, 0);.  as
1d6d0 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
1d6e0 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
1d6f0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1d700 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1d710 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b  gister(&two, 0);
1d720 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
1d730 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
1d740 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d750 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61  ) );..  /* We ca
1d760 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20  n find a VFS by 
1d770 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73  its name */.  as
1d780 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1d790 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
1d7a0 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
1d7b0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1d7c0 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
1d7d0 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  wo );..  /* Call
1d7e0 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72  ing sqlite_vfs_r
1d7f0 65 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e  egister with non
1d800 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72  -zero second par
1d810 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74  ameter changes t
1d820 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
1d830 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65  VFS, even if the
1d840 20 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69   1st parameter i
1d850 73 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53  s an existig VFS
1d860 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72   that is.  ** pr
1d870 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
1d880 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64  red as the non-d
1d890 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73  efault..  */.  s
1d8a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d8b0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
1d8c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d8d0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
1d8e0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
1d8f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1d900 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
1d910 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
1d920 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1d930 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  nd(0)==&one );. 
1d940 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1d950 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a  ister(&two, 1);.
1d960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d970 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
1d980 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
1d990 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1d9a0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
1d9b0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
1d9c0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1d9d0 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b  find(0)==&two );
1d9e0 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a  .  if( pMain ){.
1d9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
1da00 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
1da10 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
1da20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1da30 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
1da40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1da50 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1da60 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
1da70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1da80 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1da90 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a  )==pMain );.  }.
1daa0 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74    .  /* Unlink t
1dab0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20  he default VFS. 
1dac0 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
1dad0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1dae0 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73  VFSes.  ** regis
1daf0 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tered..  */.  fo
1db00 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1db10 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
1db20 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Vfs[0]); i++){. 
1db30 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
1db40 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1db50 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
1db60 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  [i] ){.      ass
1db70 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
1db80 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1db90 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
1dba0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1dbb0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
1dbc0 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20  (apVfs[i]);.    
1dbd0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1dbe0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
1dbf0 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
1dc00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1dc10 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1dc20 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1dc30 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72    .  /* Register
1dc40 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73   the main VFS as
1dc50 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69   non-default (wi
1dc60 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75  ll be made defau
1dc70 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69  lt, since.  ** i
1dc80 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79  t'll be the only
1dc90 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63   one in existenc
1dca0 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e)..  */.  sqlit
1dcb0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
1dcc0 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73  pMain, 0);.  ass
1dcd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1dce0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
1dcf0 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65  );.  .  /* Un-re
1dd00 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
1dd10 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73  VFS again to res
1dd20 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46  tore an empty VF
1dd30 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  S list */.  sqli
1dd40 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1dd50 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73  er(pMain);.  ass
1dd60 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
1dd70 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
1dd80 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20    /* Relink all 
1dd90 56 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65  VFSes in reverse
1dda0 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66   order. */  .  f
1ddb0 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
1ddc0 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
1ddd0 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
1dde0 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
1ddf0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
1de00 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1de10 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
1de20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
1de30 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
1de40 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1de50 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
1de60 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
1de70 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
1de80 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
1de90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65  }.  }..  /* Unre
1dea0 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c  gister out sampl
1deb0 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71  e VFSes. */.  sq
1dec0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1ded0 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
1dee0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1def0 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f  ster(&two);..  /
1df00 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  * Unregistering 
1df10 61 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f  a VFS that is no
1df20 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69  t currently regi
1df30 73 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65  stered is harmle
1df40 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ss */.  sqlite3_
1df50 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
1df60 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
1df70 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
1df80 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  two);.  assert( 
1df90 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1dfa0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a  ("__one")==0 );.
1dfb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dfc0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
1dfd0 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  o")==0 );..  /* 
1dfe0 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66  We should be lef
1dff0 74 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69  t with the origi
1e000 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20  nal default VFS 
1e010 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a  back as the.  **
1e020 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61   original */.  a
1e030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1e040 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
1e050 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  n );..  return T
1e060 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e070 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e  tclcmd:   vfs_in
1e080 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a  itfail_test.**.*
1e090 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
1e0a0 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  nd attempts to v
1e0b0 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f  fs_find and vfs_
1e0c0 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68  register when th
1e0d0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69  e.** sqlite3_ini
1e0e0 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66  tialize() interf
1e0f0 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20  ace is failing. 
1e100 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c   All calls shoul
1e110 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69  d fail..*/.stati
1e120 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61  c int vfs_initfa
1e130 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
1e140 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1e150 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1e160 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1e170 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1e180 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e190 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1e1a0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1e1b0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1e1c0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1e1d0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1e1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e1f0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1e200 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e210 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1e220 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1e230 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1e240 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
1e250 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
1e260 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
1e270 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
1e280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
1e290 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1e2a0 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
1e2b0 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
1e2c0 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
1e2d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1e2e0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1e2f0 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
1e300 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1e310 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
1e320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
1e330 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e340 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
1e350 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1e360 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
1e370 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
1e380 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
1e390 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
1e3a0 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
1e3b0 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
1e3c0 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
1e3d0 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73   int vfs_unregis
1e3e0 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
1e3f0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1e400 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1e410 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1e420 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1e430 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e440 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1e450 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1e460 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1e470 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1e480 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1e490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e4a0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1e4b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e4c0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1e4d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1e4e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1e4f0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
1e500 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
1e510 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
1e520 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1e530 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
1e540 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
1e550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
1e560 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
1e570 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
1e580 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
1e590 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
1e5a0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
1e5b0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
1e5c0 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
1e5d0 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
1e5e0 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
1e5f0 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
1e600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1e610 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
1e620 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
1e630 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1e640 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1e650 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1e660 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1e670 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1e680 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1e690 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1e6a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1e6b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1e6c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e6d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1e6e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1e6f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e700 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1e710 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1e720 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1e730 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20   i<nVfs; i++){. 
1e740 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1e750 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
1e760 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
1e770 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e780 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
1e790 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
1e7a0 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
1e7b0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
1e7c0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
1e7d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
1e7e0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
1e7f0 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
1e800 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
1e810 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
1e820 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
1e830 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
1e840 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1e850 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1e860 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1e870 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1e880 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e890 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1e8a0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1e8b0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1e8c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1e8d0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1e8e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1e8f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1e900 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e910 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1e920 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1e930 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
1e940 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e950 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1e960 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1e970 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e980 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e990 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e9a0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
1e9b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1e9c0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1e9d0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1e9e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e9f0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1ea00 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1ea10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ea20 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1ea30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ea50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1ea60 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
1ea70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1ea80 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
1ea90 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1eaa0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
1eab0 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
1eac0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
1ead0 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
1eae0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1eaf0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
1eb00 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
1eb10 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
1eb20 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
1eb30 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1eb40 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
1eb50 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1eb60 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65  _control(db, "te
1eb70 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  mp", -1, &iArg);
1eb80 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1eb90 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1eba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1ebb0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
1ebc0 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  d:   sqlite3_vfs
1ebd0 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65  _list.**.**   Re
1ebe0 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20  turn a tcl list 
1ebf0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
1ec00 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69  ames of all regi
1ec10 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f  stered vfs's..*/
1ec20 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
1ec30 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  list(.  ClientDa
1ec40 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1ec50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1ec60 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1ec70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1ec80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ec90 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1eca0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1ecb0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1ecc0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1ecd0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1ece0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1ecf0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1ed00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ed10 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1ed20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1ed30 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ed40 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Vfs;.  Tcl_Obj *
1ed50 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
1ed60 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  j();.  if( objc!
1ed70 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
1ed80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1ed90 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
1eda0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1edb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
1edc0 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66  (pVfs=sqlite3_vf
1edd0 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b  s_find(0); pVfs;
1ede0 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78   pVfs=pVfs->pNex
1edf0 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  t){.    Tcl_List
1ee00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1ee10 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
1ee20 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1ee30 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29  pVfs->zName, -1)
1ee40 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
1ee50 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1ee60 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72  , pRet);.  retur
1ee70 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
1ee80 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
1ee90 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20  qlite3_limit DB 
1eea0 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54  ID VALUE.**.** T
1eeb0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
1eec0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
1eed0 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65  _limit interface
1eee0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
1eef0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
1ef00 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
1ef10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ef20 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65  st_limit(.  Clie
1ef30 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1ef40 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1ef50 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1ef60 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1ef70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ef80 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1ef90 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1efa0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1efb0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1efc0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1efd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1efe0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1eff0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f000 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1f010 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1f020 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1f030 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  b;.  int rc;.  s
1f040 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1f050 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
1f060 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
1f070 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20  id;.  } aId[] = 
1f080 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  {.    { "SQLITE_
1f090 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20  LIMIT_LENGTH",  
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1f0b0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20  TE_LIMIT_LENGTH 
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1f0d0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
1f0e0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22  IMIT_SQL_LENGTH"
1f0f0 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
1f100 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
1f110 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
1f120 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
1f130 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20  MIT_COLUMN",    
1f140 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f150 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20  _LIMIT_COLUMN   
1f160 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1f170 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
1f180 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20  IT_EXPR_DEPTH", 
1f190 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1f1a0 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
1f1b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1f1c0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
1f1d0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1f1e0 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  T",     SQLITE_L
1f1f0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
1f200 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20  LECT      },.   
1f210 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
1f220 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20  _VDBE_OP",      
1f230 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
1f240 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20  MIT_VDBE_OP     
1f250 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1f260 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
1f270 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20  FUNCTION_ARG",  
1f280 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
1f290 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  IT_FUNCTION_ARG 
1f2a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
1f2b0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41   "SQLITE_LIMIT_A
1f2c0 54 54 41 43 48 45 44 22 2c 20 20 20 20 20 20 20  TTACHED",       
1f2d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
1f2e0 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
1f2f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
1f300 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  "SQLITE_LIMIT_LI
1f310 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
1f320 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  H", SQLITE_LIMIT
1f330 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
1f340 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22  NGTH  },.    { "
1f350 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
1f360 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20  IABLE_NUMBER",  
1f370 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
1f380 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
1f390 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20       },.    .   
1f3a0 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65   /* Out of range
1f3b0 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20   test cases */. 
1f3c0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
1f3d0 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20  IT_TOOSMALL",   
1f3e0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20           -1,    
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1f410 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
1f420 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20  T_TOOBIG",      
1f430 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
1f440 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
1f450 4d 42 45 52 2b 31 20 20 20 20 7d 2c 0a 20 20 7d  MBER+1    },.  }
1f460 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20  ;.  int i, id;. 
1f470 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73   int val;.  cons
1f480 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20  t char *zId;..  
1f490 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
1f4a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1f4b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1f4c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1f4d0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1f4e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1f4f0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1f500 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55  0), " DB ID VALU
1f510 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
1f520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f530 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1f540 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1f550 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f560 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1f570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f580 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zId = Tcl_GetStr
1f590 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1f5a0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
1f5b0 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
1f5c0 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
1f5d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c   if( strcmp(zId,
1f5e0 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d   aId[i].zName)==
1f5f0 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20  0 ){.      id = 
1f600 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20  aId[i].id;.     
1f610 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f620 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
1f630 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
1f640 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  d[0]) ){.    Tcl
1f650 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f660 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  terp, "unknown l
1f670 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49  imit type: ", zI
1f680 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  d, (char*)0);.  
1f690 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f6a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
1f6b0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1f6c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1f6d0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
1f6e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1f6f0 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  = sqlite3_limit(
1f700 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20  db, id, val);.  
1f710 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1f720 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1f730 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
1f740 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
1f750 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
1f760 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
1f770 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  e.**.** Save the
1f780 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73   state of the ps
1f790 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
1f7a0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  er generator..**
1f7b0 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
1f7c0 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73  e, verify that s
1f7d0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f7e0 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77  rol works even w
1f7f0 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  hen.** called wi
1f800 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e  th an out-of-ran
1f810 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  ge opcode..*/.st
1f820 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72  atic int save_pr
1f830 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
1f840 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1f850 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1f860 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1f870 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1f880 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f890 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1f8a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1f8b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1f8c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1f8d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1f8e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f8f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1f900 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f910 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1f920 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1f930 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
1f940 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f950 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73  rol(9999);.  ass
1f960 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
1f970 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
1f980 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20  t_control(-1);. 
1f990 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
1f9a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ;.  sqlite3_test
1f9b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f9c0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
1f9d0 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  VE);.  return TC
1f9e0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
1f9f0 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70  lcmd:  restore_p
1fa00 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
1fa10 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65 5f  tic int restore_
1fa20 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
1fa30 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1fa40 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1fa50 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1fa60 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1fa70 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1fa80 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1fa90 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1faa0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1fab0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1fac0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1fad0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fae0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1faf0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1fb00 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1fb10 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1fb20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1fb30 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1fb40 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1fb50 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65  G_RESTORE);.  re
1fb60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
1fb70 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
1fb80 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  set_prng_state.*
1fb90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
1fba0 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  et_prng_state(. 
1fbb0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1fbc0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1fbd0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1fbe0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1fbf0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1fc00 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1fc10 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1fc20 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1fc30 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1fc40 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1fc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fc60 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1fc70 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1fc80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1fc90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1fca0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
1fcb0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fcc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fcd0 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72  PRNG_RESET);.  r
1fce0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fcf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
1fd00 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
1fd10 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1fd20 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
1fd30 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
1fd40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1fd50 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1fd60 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
1fd70 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
1fd80 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
1fd90 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
1fda0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  rn int sqlite3_o
1fdb0 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a  pen_file_count;.
1fdc0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1fdd0 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b  ite3_sort_count;
1fde0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1fdf0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1fe00 6d 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  me;.  extern int
1fe10 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f   sqlite3_max_blo
1fe20 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20  bsize;.  extern 
1fe30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1fe40 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
1fe50 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20  t(void*,.       
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69     Tcl_Interp*,i
1fe90 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54  nt,Tcl_Obj*CONST
1fea0 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *);.  static str
1feb0 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
1fec0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
1fed0 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  _CmdProc *xProc;
1fee0 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a  .  } aCmd[] = {.
1fef0 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72       { "db_enter
1ff00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1ff10 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1ff20 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20  Proc*)db_enter  
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1ff40 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65       { "db_leave
1ff50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1ff60 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1ff70 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20  Proc*)db_leave  
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1ff90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1ffa0 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  mprintf_int",   
1ffb0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1ffc0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
1ffd0 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a  rintf_int    },.
1ffe0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1fff0 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20  mprintf_int64", 
20000 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
20010 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
20020 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a  rintf_int64  },.
20030 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20040 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  mprintf_str",   
20050 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
20060 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
20070 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a  rintf_str    },.
20080 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20090 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  snprintf_str",  
200a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
200b0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e  Proc*)sqlite3_sn
200c0 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a  printf_str   },.
200d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
200e0 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22  mprintf_stronly"
200f0 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
20100 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
20110 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a  rintf_stronly},.
20120 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20130 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c  mprintf_double",
20140 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
20150 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
20160 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a  rintf_double },.
20170 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20180 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c  mprintf_scaled",
20190 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
201a0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
201b0 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a  rintf_scaled },.
201c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
201d0 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
201e0 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  e",   (Tcl_CmdPr
201f0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
20200 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a  ntf_hexdouble},.
20210 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20220 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c  mprintf_z_test",
20230 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
20240 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
20250 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_z        },. 
20260 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
20270 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20  printf_n_test", 
20280 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
20290 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
202a0 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_n        },.  
202b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
202c0 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
202d0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
202e0 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74  oc*)test_snprint
202f0 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20  f_int     },.   
20300 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73    { "sqlite3_las
20310 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
20320 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
20330 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  c*)test_last_row
20340 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  id       },.    
20350 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
20360 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  _printf",       
20370 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
20380 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e  *)test_exec_prin
20390 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  tf      },.     
203a0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22  { "sqlite3_exec"
203b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
203c0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
203d0 29 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20  )test_exec      
203e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
203f0 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e   "sqlite3_exec_n
20400 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
20410 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
20420 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20  test_exec_nr    
20430 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
20440 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
20450 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
20460 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
20470 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
20480 69 6e 74 66 20 7d 2c 0a 20 20 20 20 20 7b 20 22  intf },.     { "
20490 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20  sqlite3_close", 
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
204c0 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20  lite_test_close 
204d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
204e0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
204f0 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28  nction",       (
20500 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
20510 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
20520 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  n  },.     { "sq
20530 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
20540 72 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54  regate",      (T
20550 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
20560 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
20570 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
20580 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73  ite_register_tes
20590 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63  t_function", (Tc
205a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
205b0 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20  register_func   
205c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
205d0 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20  te_abort",      
205e0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
205f0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
20600 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20  _abort          
20610 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20620 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20  e_bind",        
20630 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
20640 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69  CmdProc*)test_bi
20650 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  nd             }
20660 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70  ,.     { "breakp
20670 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  oint",          
20680 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
20690 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65  mdProc*)test_bre
206a0 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c  akpoint       },
206b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
206c0 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  _key",          
206d0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
206e0 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20  dProc*)test_key 
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
20700 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20710 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
20720 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
20730 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79  Proc*)test_rekey
20740 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
20750 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65      { "sqlite_se
20760 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20  t_magic",       
20770 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
20780 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f  roc*)sqlite_set_
20790 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20  magic      },.  
207a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e     { "sqlite3_in
207b0 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20  terrupt",       
207c0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
207d0 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75  oc*)test_interru
207e0 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  pt        },.   
207f0 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65    { "sqlite_dele
20800 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
20810 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
20820 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  c*)delete_functi
20830 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  on       },.    
20840 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
20850 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20  e_collation",   
20860 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
20870 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  *)delete_collati
20880 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  on      },.     
20890 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  { "sqlite3_get_a
208a0 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20  utocommit",     
208b0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
208c0 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20  )get_autocommit 
208d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
208e0 20 22 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f   "sqlite3_stack_
208f0 75 73 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  used",          
20900 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
20910 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 20  test_stack_used 
20920 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
20930 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69  "sqlite3_busy_ti
20940 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20  meout",         
20950 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
20960 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
20970 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
20980 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
209b0 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20  st_printf       
209c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
209d0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20  qlite3IoTrace", 
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
209f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
20a00 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20 20  io_trace        
20a10 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69   },.  };.  stati
20a20 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
20a30 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
20a40 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63    Tcl_ObjCmdProc
20a50 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f   *xProc;.     vo
20a60 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id *clientData;.
20a70 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20    } aObjCmd[] = 
20a80 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
20a90 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
20aa0 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71  nter",    get_sq
20ab0 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20  lite_pointer, 0 
20ac0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20ad0 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20  e3_bind_int",   
20ae0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
20af0 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30  bind_int,      0
20b00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20b10 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
20b20 62 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  b",         test
20b30 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20  _bind_zeroblob, 
20b40 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
20b50 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22  ite3_bind_int64"
20b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
20b70 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20  t_bind_int64,   
20b80 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
20b90 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
20ba0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
20bb0 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20  st_bind_double, 
20bc0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
20bd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
20be0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
20bf0 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20  est_bind_null   
20c00 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
20c10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
20c20 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
20c30 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20  test_bind_text  
20c40 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
20c50 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65  "sqlite3_bind_te
20c60 78 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  xt16",          
20c70 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31   test_bind_text1
20c80 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  6   ,0 },.     {
20c90 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62   "sqlite3_bind_b
20ca0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
20cb0 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62    test_bind_blob
20cc0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
20cd0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
20ce0 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22  parameter_count"
20cf0 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  ,  test_bind_par
20d00 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d  ameter_count, 0}
20d10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20d20 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
20d30 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 62  _name",   test_b
20d40 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
20d50 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20  me,  0},.     { 
20d60 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
20d70 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c 20  rameter_index", 
20d80 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
20d90 65 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a  eter_index, 0},.
20da0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20db0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c  clear_bindings",
20dc0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c 65          test_cle
20dd0 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c  ar_bindings, 0},
20de0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20df0 5f 73 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  _sleep",        
20e00 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 6c           test_sl
20e10 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 30 7d  eep,          0}
20e20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20e30 33 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20  3_errcode",     
20e40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
20e50 72 72 63 6f 64 65 20 20 20 20 20 20 20 2c 30 20  rrcode       ,0 
20e60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20e70 65 33 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20  e3_errmsg",     
20e80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
20e90 65 72 72 6d 73 67 20 20 20 20 20 20 20 20 2c 30  errmsg        ,0
20ea0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20eb0 74 65 33 5f 65 72 72 6d 73 67 31 36 22 2c 20 20  te3_errmsg16",  
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
20ed0 5f 65 72 72 6d 73 67 31 36 20 20 20 20 20 20 2c  _errmsg16      ,
20ee0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
20ef0 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20  ite3_open",     
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
20f10 74 5f 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20  t_open          
20f20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
20f30 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20  lite3_open16",  
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
20f50 73 74 5f 6f 70 65 6e 31 36 20 20 20 20 20 20 20  st_open16       
20f60 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
20f70 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
20f80 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  6",            t
20f90 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20  est_complete16  
20fa0 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20    ,0 },..     { 
20fb0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
20fc0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20fd0 20 74 65 73 74 5f 70 72 65 70 61 72 65 20 20 20   test_prepare   
20fe0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
20ff0 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
21000 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  e16",           
21010 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36    test_prepare16
21020 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
21030 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
21040 72 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  re_v2",         
21050 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f     test_prepare_
21060 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  v2    ,0 },.    
21070 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
21080 61 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20  are_tkt3134",   
21090 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
210a0 5f 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20  _tkt3134, 0},.  
210b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
210c0 65 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20  epare16_v2",    
210d0 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
210e0 72 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20  re16_v2  ,0 },. 
210f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66      { "sqlite3_f
21100 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20  inalize",       
21110 20 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61         test_fina
21120 6c 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a  lize      ,0 },.
21130 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21140 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  reset",         
21150 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73          test_res
21160 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  et         ,0 },
21170 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21180 5f 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20  _expired",      
21190 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78           test_ex
211a0 70 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d  pired       ,0 }
211b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
211c0 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
211d0 6e 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74  ngs",     test_t
211e0 72 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20  ransfer_bind ,0 
211f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21200 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  e3_changes",    
21210 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
21220 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30  changes       ,0
21230 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
21240 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20  te3_step",      
21250 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21260 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c  _step          ,
21270 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
21280 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c  ite3_next_stmt",
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
212a0 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20  t_next_stmt     
212b0 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
212c0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
212d0 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74  emory",        t
212e0 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
212f0 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ry,     0},.    
21300 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74   { "sqlite3_soft
21310 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20  _heap_limit",   
21320 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65      test_soft_he
21330 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c  ap_limit,    0},
21340 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21350 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22  _thread_cleanup"
21360 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68  ,        test_th
21370 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20  read_cleanup,   
21380 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
21390 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
213a0 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65  ounts",       te
213b0 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
213c0 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20  ts,    0},..    
213d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64   { "sqlite3_load
213e0 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
213f0 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78      test_load_ex
21400 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c  tension,     0},
21410 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21420 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
21430 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e  ension", test_en
21440 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20  able_load,      
21450 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
21460 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
21470 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65  esult_codes", te
21480 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
21490 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20  lt_codes, 0},.  
214a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
214b0 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
214c0 20 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74        test_limit
214d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
214e0 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73    0},..     { "s
214f0 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  ave_prng_state",
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21510 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  ave_prng_state, 
21520 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
21530 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
21540 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
21550 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
21560 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
21570 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74  "reset_prng_stat
21580 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
21590 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
215a0 65 2c 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20  e,   0 },..     
215b0 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  /* sqlite3_colum
215c0 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20  n_*() API */.   
215d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
215e0 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  umn_count",     
215f0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
21600 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20  _count  ,0 },.  
21610 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61     { "sqlite3_da
21620 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  ta_count",      
21630 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f        test_data_
21640 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20  count    ,0 },. 
21650 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
21660 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20  olumn_type",    
21670 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
21680 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a  mn_type   ,0 },.
21690 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
216a0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20  column_blob",   
216b0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
216c0 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c  umn_blob   ,0 },
216d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
216e0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c  _column_double",
216f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
21700 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d  lumn_double ,0 }
21710 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
21720 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c  3_column_int64",
21730 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
21740 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20  olumn_int64  ,0 
21750 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21760 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c  e3_column_text",
21770 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
21780 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f  _utf8,  sqlite3_
21790 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 20 20 20 20  column_text     
217a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
217b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22  te3_column_name"
217c0 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
217d0 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33  t_utf8,  sqlite3
217e0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20  _column_name    
217f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
21800 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22  ite3_column_int"
21810 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74  ,        test_st
21820 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65  mt_int,   sqlite
21830 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 20 20  3_column_int    
21840 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
21850 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
21860 65 73 22 2c 20 20 20 20 20 20 74 65 73 74 5f 73  es",      test_s
21870 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74  tmt_int,   sqlit
21880 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20  e3_column_bytes 
21890 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
218a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
218b0 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  YPE.     { "sqli
218c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
218d0 79 70 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ype",   test_stm
218e0 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33  t_utf8,  sqlite3
218f0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
21900 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64    },.#endif.#ifd
21910 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21920 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
21930 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
21940 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
21950 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
21960 38 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  8, sqlite3_colum
21970 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d  n_database_name}
21980 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
21990 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c  umn_table_name",
219a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
219b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
219c0 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  table_name},.{ "
219d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
219e0 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 20 74 65 73  rigin_name", tes
219f0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 73 71 6c  t_stmt_utf8, sql
21a00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
21a10 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66  in_name},.#endif
21a20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21a30 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
21a40 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
21a50 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
21a60 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
21a70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
21a80 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
21a90 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
21aa0 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 20 20  umn_text16",    
21ab0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
21ac0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
21ad0 5f 74 65 78 74 31 36 20 20 20 20 7d 2c 0a 20 20  _text16    },.  
21ae0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
21af0 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 20  lumn_name16",   
21b00 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
21b10 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
21b20 6e 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c 0a 20  n_name16    },. 
21b30 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e      { "add_align
21b40 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
21b50 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e  ions", add_align
21b60 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
21b70 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a  ions, 0      },.
21b80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b90 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20  MIT_DECLTYPE.   
21ba0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
21bb0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c  umn_decltype16",
21bc0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
21bd0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
21be0 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65  _decltype16},.#e
21bf0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
21c00 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
21c10 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69  _METADATA.{"sqli
21c20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
21c30 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74  ase_name16",.  t
21c40 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
21c50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
21c60 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c  atabase_name16},
21c70 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
21c80 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c  n_table_name16",
21c90 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
21ca0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
21cb0 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
21cc0 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
21cd0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
21ce0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
21cf0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
21d00 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c  _origin_name16},
21d10 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
21d20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
21d30 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
21d40 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
21d50 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30  _collation_v2, 0
21d60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
21d70 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
21d80 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c  er",     test_gl
21d90 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20  obal_recover, 0 
21da0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72    },.     { "wor
21db0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c  king_64bit_int",
21dc0 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e            workin
21dd0 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30  g_64bit_int,   0
21de0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
21df0 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20  s_unlink_test", 
21e00 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 75             vfs_u
21e10 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20  nlink_test,     
21e20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
21e30 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
21e40 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73 5f  ",          vfs_
21e50 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20 20  initfail_test,  
21e60 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
21e70 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21e80 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66 73  ll",         vfs
21e90 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c  _unregister_all,
21ea0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
21eb0 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f  "vfs_reregister_
21ec0 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
21ed0 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
21ee0 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
21ef0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
21f00 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 66  est",          f
21f10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
21f20 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
21f30 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c  { "sqlite3_vfs_l
21f40 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ist",           
21f50 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20  vfs_list,     0 
21f60 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75    },..     /* Fu
21f70 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e  nctions from os.
21f80 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  h */.#ifndef SQL
21f90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
21fa0 23 69 66 20 30 0a 20 20 20 20 20 7b 20 22 73 71  #if 0.     { "sq
21fb0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
21fc0 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69 74  rite",test_sqlit
21fd0 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
21fe0 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
21ff0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c  sqlite3OsClose",
22000 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
22010 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d  ite3OsClose, 0 }
22020 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
22030 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20  3OsLock",       
22040 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73    test_sqlite3Os
22050 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 20 20  Lock, 0 },.     
22060 7b 20 22 73 71 6c 69 74 65 33 4f 73 54 65 6d 70  { "sqlite3OsTemp
22070 46 69 6c 65 4e 61 6d 65 22 2c 20 74 65 73 74 5f  FileName", test_
22080 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
22090 65 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20 20 20 0a  eName, 0 },.   .
220a0 20 20 20 20 20 2f 2a 20 43 75 73 74 6f 6d 20 74       /* Custom t
220b0 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 2a  est interfaces *
220c0 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
220d0 33 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20 20 20 20  3OsUnlock",     
220e0 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
220f0 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 20 20 20 7d  OsUnlock, 0    }
22100 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
22110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22120 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
22130 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
22140 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
22150 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
22160 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
22170 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
22180 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
22190 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
221a0 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
221b0 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
221c0 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
221d0 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
221e0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
221f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22200 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
22210 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
22220 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
22230 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
22240 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
22250 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
22260 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
22270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22280 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
22290 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
222a0 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
222b0 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
222c0 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
222d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
222e0 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
222f0 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
22300 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
22310 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
22320 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
22330 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
22340 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
22350 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
22360 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
22370 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
22380 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20  METADATA.     { 
22390 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  "sqlite3_table_c
223a0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c  olumn_metadata",
223b0 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
223c0 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20  mn_metadata, 0  
223d0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  },.#endif.#ifnde
223e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
223f0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
22400 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
22410 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ",  test_blob_re
22420 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
22430 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
22440 72 69 74 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62  rite", test_blob
22450 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65  _write, 0  },.#e
22460 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ndif.  };.  stat
22470 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73  ic int bitmask_s
22480 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74  ize = sizeof(Bit
22490 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69  mask)*8;.  int i
224a0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
224b0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
224c0 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
224d0 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
224e0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
224f0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
22500 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
22510 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
22520 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
22530 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
22540 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
22550 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
22560 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
22570 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
22580 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
22590 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
225a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
225b0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
225c0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
225d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
225e0 65 65 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51  ee_count;.#if SQ
225f0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
22600 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
22610 45 53 54 29 20 26 26 20 53 51 4c 49 54 45 5f 54  EST) && SQLITE_T
22620 48 52 45 41 44 53 41 46 45 0a 20 20 65 78 74 65  HREADSAFE.  exte
22630 72 6e 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  rn int threadsOv
22640 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
22650 4c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Locks;.#endif.#i
22660 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
22670 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
22680 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65  ite3_os_type;.#e
22690 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
226a0 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72  TE_DEBUG.  exter
226b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
226c0 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  reTrace;.  exter
226d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54  n int sqlite3OST
226e0 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
226f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
22700 64 6f 70 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  dopTrace;.#endif
22710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22720 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
22730 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22740 69 6e 5f 6f 70 74 3b 0a 20 20 65 78 74 65 72 6e  in_opt;.  extern
22750 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75   char sqlite3_qu
22760 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74  ery_plan[];.  st
22770 61 74 69 63 20 63 68 61 72 20 2a 71 75 65 72 79  atic char *query
22780 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f  _plan = sqlite3_
22790 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 65 6e 64  query_plan;.#end
227a0 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  if..  for(i=0; i
227b0 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69  <sizeof(aCmd)/si
227c0 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69  zeof(aCmd[0]); i
227d0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
227e0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
227f0 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  p, aCmd[i].zName
22800 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  , aCmd[i].xProc,
22810 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f   0, 0);.  }.  fo
22820 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
22830 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28  aObjCmd)/sizeof(
22840 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  aObjCmd[0]); i++
22850 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
22860 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
22870 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a  rp, aObjCmd[i].z
22880 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61  Name, .        a
22890 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
228a0 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65   aObjCmd[i].clie
228b0 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a  ntData, 0);.  }.
228c0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
228d0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65  terp, "sqlite_se
228e0 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  arch_count", .  
228f0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22900 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
22910 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
22920 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
22930 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
22940 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
22950 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
22960 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
22970 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
22980 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22990 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
229a0 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
229b0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
229c0 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
229d0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
229e0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
229f0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
22a00 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
22a10 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22a20 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43  3_like_count, TC
22a30 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
22a40 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22a50 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
22a60 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
22a70 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22a80 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
22a90 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
22aa0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
22ab0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
22ac0 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
22ad0 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
22ae0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
22af0 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
22b00 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
22b10 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
22b20 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
22b30 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
22b40 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
22b50 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
22b60 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
22b70 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
22b80 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
22b90 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
22ba0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
22bb0 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
22bc0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
22bd0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22be0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
22bf0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
22c00 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
22c10 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
22c20 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
22c30 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
22c40 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
22c50 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
22c60 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
22c70 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
22c80 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
22c90 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
22ca0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
22cb0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
22cc0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
22cd0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
22ce0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
22cf0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
22d00 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
22d10 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
22d20 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22d30 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
22d40 72 65 65 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ree_count",.    
22d50 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22d60 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
22d70 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
22d80 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
22d90 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
22da0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22db0 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
22dc0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
22dd0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
22de0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
22df0 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
22e00 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
22e10 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
22e20 58 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  X && defined(SQL
22e30 49 54 45 5f 54 45 53 54 29 20 26 26 20 53 51 4c  ITE_TEST) && SQL
22e40 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
22e50 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22e60 65 72 70 2c 20 22 74 68 72 65 61 64 73 4f 76 65  erp, "threadsOve
22e70 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
22e80 6f 63 6b 73 22 2c 0a 20 20 20 20 20 20 28 63 68  ocks",.      (ch
22e90 61 72 2a 29 26 74 68 72 65 61 64 73 4f 76 65 72  ar*)&threadsOver
22ea0 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
22eb0 63 6b 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  cks, TCL_LINK_IN
22ec0 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  T);.#endif.#ifnd
22ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
22ee0 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
22ef0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
22f00 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63  te_last_needed_c
22f10 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20  ollation",.     
22f20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65   (char*)&pzNeede
22f30 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f  dCollation, TCL_
22f40 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
22f50 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
22f60 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
22f70 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f  TE_OS_WIN.  Tcl_
22f80 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
22f90 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22  "sqlite_os_type"
22fa0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
22fb0 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
22fc0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
22fd0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
22fe0 4c 49 54 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f  LITE_TEST.  Tcl_
22ff0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23000 22 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c  "sqlite_query_pl
23010 61 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  an",.      (char
23020 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54  *)&query_plan, T
23030 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
23040 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
23050 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Y);.#endif.#ifde
23060 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
23070 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
23080 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 61 64 64  erp, "sqlite_add
23090 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  op_trace",.     
230a0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
230b0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 2c 20  VdbeAddopTrace, 
230c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
230d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
230e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65  erp, "sqlite_whe
230f0 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  re_trace",.     
23100 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
23110 57 68 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f  WhereTrace, TCL_
23120 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
23130 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
23140 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
23150 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
23160 29 26 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65  )&sqlite3OSTrace
23170 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
23180 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
23190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
231a0 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  IO.  Tcl_LinkVar
231b0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
231c0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22  _opentemp_count"
231d0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
231e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
231f0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
23200 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
23210 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
23220 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
23230 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a  ic_bind_value",.
23240 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
23250 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
23260 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _value, TCL_LINK
23270 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
23280 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23290 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
232a0 69 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20  ind_nbyte",.    
232b0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
232c0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
232d0 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  te, TCL_LINK_INT
232e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
232f0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
23300 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22  _temp_directory"
23310 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
23320 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
23330 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b  ectory, TCL_LINK
23340 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
23350 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23360 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a  "bitmask_size",.
23370 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62 69        (char*)&bi
23380 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f  tmask_size, TCL_
23390 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e  LINK_INT|TCL_LIN
233a0 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20  K_READ_ONLY);.  
233b0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
233c0 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63  rp, "sqlite_sync
233d0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
233e0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
233f0 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
23400 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
23410 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23420 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63  "sqlite_fullsync
23430 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
23440 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
23450 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54  ullsync_count, T
23460 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
23470 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23480 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
23490 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 65  nterp, "sqlite_e
234a0 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 22 2c 0a 20  nable_in_opt",. 
234b0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
234c0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  ite3_enable_in_o
234d0 70 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  pt, TCL_LINK_INT
234e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
234f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a           rn TCL_OK;.}.