/ Hex Artifact Content
Login

Artifact 2d3ab2cacced2adfee13a6d93b3570ada4072c39:


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 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tcl.h".#include 
0250: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0260: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0270: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0280: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0290: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
02a0: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
02b0: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
02c0: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
02d0: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
02e0: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
02f0: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0300: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
0310: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
0320: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
0330: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
0340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
0350: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0370: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0380: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0390: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
03a0: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
03b0: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
03c0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
03d0: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
03e0: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
03f0: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0400: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
0410: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
0420: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
0430: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
0440: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
0450: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
0460: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0470: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0480: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0490: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
04a0: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
04b0: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
04c0: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
04d0: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
04e0: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
04f0: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0500: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
0510: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
0520: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
0530: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
0540: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
0550: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
0560: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0570: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0580: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0590: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
05a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
05b0: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
05c0: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
05d0: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
05e0: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
05f0: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0600: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
0610: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
0620: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
0630: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
0640: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
0650: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
0660: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0670: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0680: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0690: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
06a0: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
06b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
06c0: 74 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  t get_sqlite_poi
06d0: 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  nter(.  void * c
06e0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
06f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0700: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0710: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0720: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
0730: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
0740: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
0750: 6e 66 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  nfo;.  char zBuf
0760: 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a  [100];.  if( obj
0770: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
0780: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0790: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
07a0: 51 4c 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e  QLITE-CONNECTION
07b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
07c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
07d0: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
07e0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
07f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
0800: 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
0810: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
0820: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0830: 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
0840: 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  ound: ",.       
0850: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
0860: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
0870: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
0880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0890: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 53  .  p = (struct S
08a0: 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
08b0: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a  .objClientData;.
08c0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
08d0: 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  "%p", p->db);.  
08e0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75 66  if( strncmp(zBuf
08f0: 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20 20  ,"0x",2) ){.    
0900: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 30  sprintf(zBuf, "0
0910: 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  x%p", p->db);.  
0920: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
0930: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
0940: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
0950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
0960: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0970: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 20  r to an sqlite3 
0980: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 67  object..*/.int g
0990: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
09a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
09b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
09c0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 7b  sqlite3 **ppDb){
09d0: 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65  .  struct Sqlite
09e0: 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d 64  Db *p;.  Tcl_Cmd
09f0: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
0a00: 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if( Tcl_GetComma
0a10: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
0a20: 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  A, &cmdInfo) ){.
0a30: 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74 20      p = (struct 
0a40: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
0a50: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
0a60: 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d 3e  .    *ppDb = p->
0a70: 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  db;.  }else{.   
0a80: 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74 65   *ppDb = (sqlite
0a90: 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  3*)sqlite3TestTe
0aa0: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 7d  xtToPtr(zA);.  }
0ab0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0ac0: 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 63 68 61 72  ;.}...const char
0ad0: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72 72   *sqlite3TestErr
0ae0: 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  orName(int rc){.
0af0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
0b00: 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  ame = 0;.  switc
0b10: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
0b20: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0b40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
0b50: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
0b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0b70: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0b90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
0ba0: 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROR";           
0bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0bc0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
0bd0: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  L:            zN
0be0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
0bf0: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
0c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c10: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0c30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
0c40: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
0c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c60: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0c80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
0c90: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
0ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0cb0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0cd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
0ce0: 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SY";            
0cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0d00: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0d20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
0d30: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
0d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0d50: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
0d60: 53 48 41 52 45 44 43 41 43 48 45 3a 20 20 7a 4e  SHAREDCACHE:  zN
0d70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
0d80: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d90: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ";break;.    cas
0da0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0dc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0dd0: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
0de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0df0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
0e00: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  Y:            zN
0e10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
0e20: 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20  ADONLY";        
0e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0e40: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
0e50: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  PT:           zN
0e60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
0e70: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
0e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0e90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0eb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
0ec0: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
0ed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0ee0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
0ef0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
0f00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
0f10: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
0f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0f30: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
0f40: 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  D:            zN
0f50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0f60: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
0f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0f80: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0fa0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55  ame = "SQLITE_FU
0fb0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  LL";            
0fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0fd0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
0fe0: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  N:            zN
0ff0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
1000: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
1010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1020: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
1030: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  L:            zN
1040: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
1050: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
1060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1070: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1090: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
10a0: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
10b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10c0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
10e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
10f0: 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20  HEMA";          
1100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1110: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1130: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
1140: 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20  OBIG";          
1150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1160: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
1170: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  INT:          zN
1180: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
1190: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
11a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11b0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
11c0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  H:            zN
11d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
11e0: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
11f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1200: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1220: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
1230: 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20  SUSE";          
1240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1250: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1270: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
1280: 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20  LFS";           
1290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12a0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
12c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
12d0: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
12e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12f0: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1310: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
1320: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
1330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1340: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1360: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
1370: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
1380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1390: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
13b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
13c0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13e0: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1400: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
1410: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
1420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1430: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
1460: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
1470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1480: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
1490: 45 41 44 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  EAD:          zN
14a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
14b0: 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20  ERR_READ";      
14c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
14e0: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 20 7a 4e  HORT_READ:    zN
14f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1500: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
1510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1520: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  e SQLITE_IOERR_W
1530: 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 7a 4e  RITE:         zN
1540: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1550: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
1560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1570: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
1580: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 7a 4e  SYNC:         zN
1590: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
15a0: 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20  ERR_FSYNC";     
15b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
15c0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
15d0: 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 7a 4e  IR_FSYNC:     zN
15e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
15f0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
1600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1610: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
1620: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 20 7a 4e  RUNCATE:      zN
1630: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1640: 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20  ERR_TRUNCATE";  
1650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1660: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
1670: 53 54 41 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  STAT:         zN
1680: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1690: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
16a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
16b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
16c0: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a 4e  NLOCK:        zN
16d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
16e0: 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20  ERR_UNLOCK";    
16f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1700: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
1710: 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a 4e  DLOCK:        zN
1720: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1730: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
1740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1750: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
1760: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  ELETE:        zN
1770: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1780: 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20  ERR_DELETE";    
1790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
17a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  e SQLITE_IOERR_B
17b0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 7a 4e  LOCKED:       zN
17c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
17d0: 45 52 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20  ERR_BLOCKED";   
17e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
17f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
1800: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 7a 4e  OMEM:         zN
1810: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1820: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
1830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1840: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
1850: 43 43 45 53 53 3a 20 20 20 20 20 20 20 20 7a 4e  CCESS:        zN
1860: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1870: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
1880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1890: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
18a0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
18b0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
18e0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
18f0: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
1900: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1910: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
1920: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1930: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1940: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
1950: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1980: 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b  SQLITE_Unknown";
1990: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
19b0: 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  Name;.}.#define 
19c0: 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c 69  t1ErrorName sqli
19d0: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
19e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
19f0: 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  an sqlite3_stmt*
1a00: 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33   into an sqlite3
1a10: 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73  *.  This depends
1a20: 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20   on the.** fact 
1a30: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1a40: 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  * is the first f
1a50: 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65  ield in the Vdbe
1a60: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23   structure..*/.#
1a70: 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28  define StmtToDb(
1a80: 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  X)   sqlite3_db_
1a90: 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a  handle(X)../*.**
1aa0: 20 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20   Check a return 
1ab0: 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75  value to make su
1ac0: 72 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74  re it agrees wit
1ad0: 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  h the results.**
1ae0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
1af0: 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcode..*/.int sq
1b00: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1b10: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1b20: 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  erp, sqlite3 *db
1b30: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28  , int rc){.  if(
1b40: 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73   sqlite3_threads
1b50: 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d  afe()==0 && rc!=
1b60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
1b70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc!=SQLITE_OK. 
1b80: 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72    && sqlite3_err
1b90: 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a  code(db)!=rc ){.
1ba0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
1bb0: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d  0];.    int r2 =
1bc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1bd0: 28 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  (db);.    sprint
1be0: 66 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63  f(zBuf, "error c
1bf0: 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73  ode %s (%d) does
1c00: 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74   not match sqlit
1c10: 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25  e3_errcode %s (%
1c20: 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72  d)",.       t1Er
1c30: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c  rorName(rc), rc,
1c40: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29   t1ErrorName(r2)
1c50: 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52  , r2);.    Tcl_R
1c60: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
1c70: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  p);.    Tcl_Appe
1c80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c90: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72   zBuf, 0);.    r
1ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1cb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1cc0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
1cd0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1ce0: 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  _stmt object..*/
1cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
1d00: 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63  tmtPointer(.  Tc
1d10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d20: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1d30: 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74  *zArg,  .  sqlit
1d40: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
1d50: 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
1d60: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73  (sqlite3_stmt*)s
1d70: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
1d80: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
1d90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1da0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1db0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
1dc0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1dd0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1de0: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1df0: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1e00: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1e10: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1e20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1e30: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1e40: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1e50: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1e60: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
1e70: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
1e80: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
1e90: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
1ea0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
1eb0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
1ec0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1ed0: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1ee0: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1ef0: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1f00: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1f10: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1f20: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1f30: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1f40: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1f50: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1f60: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
1f70: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
1f80: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
1f90: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
1fa0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
1fb0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
1fc0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1fd0: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1fe0: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1ff0: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
2000: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
2010: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
2020: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
2030: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
2040: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
2050: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
2060: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
2070: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
2080: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
2090: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
20a0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
20b0: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
20c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20d0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
20e0: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
20f0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
2100: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
2110: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
2120: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
2130: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
2140: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
2150: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
2160: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
2170: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
2180: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
2190: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
21a0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
21b0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
21c0: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
21d0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
21e0: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
21f0: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
2200: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
2210: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
2230: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2240: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
2250: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
2260: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
2270: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2280: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
2290: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  callback..*/.#if
22a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22b0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
22c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
22d0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73  NABLE_IOTRACE).s
22e0: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
22f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
2300: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
2310: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
2320: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2330: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2340: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
2350: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
2360: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
2370: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
2380: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2390: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
23a0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e  ace_file);.}.#en
23b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
23c0: 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45  :  io_trace FILE
23d0: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  NAME.**.** Turn 
23e0: 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  I/O tracing on o
23f0: 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e  r off.  If FILEN
2400: 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  AME is not an em
2410: 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49  pty string,.** I
2420: 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e  /O tracing begin
2430: 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c  s going into FIL
2440: 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41  ENAME. If FILENA
2450: 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a  ME is an empty.*
2460: 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72  * string, I/O tr
2470: 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  acing is turned 
2480: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2490: 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  nt test_io_trace
24a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
24b0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
24c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24e0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24f0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2500: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2520: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2530: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2550: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2560: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ment */.){.#if !
2570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2580: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
2590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
25a0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69  BLE_IOTRACE).  i
25b0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
25c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25e0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25f0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2600: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49  ,.          " FI
2610: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
2620: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2630: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ROR;.  }.  if( i
2640: 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20  otrace_file ){. 
2650: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66     if( iotrace_f
2660: 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69  ile!=stdout && i
2670: 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64  otrace_file!=std
2680: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  err ){.      fcl
2690: 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ose(iotrace_file
26a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74  );.    }.    iot
26b0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20  race_file = 0;. 
26c0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
26d0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
26e0: 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20   argv[1][0] ){. 
26f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
2700: 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d  gv[1],"stdout")=
2710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72  =0 ){.      iotr
2720: 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75  ace_file = stdou
2730: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
2740: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
2750: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
2760: 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69        iotrace_fi
2770: 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20  le = stderr;.   
2780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
2790: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70  trace_file = fop
27a0: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29  en(argv[1], "w")
27b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
27c0: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f  te3IoTrace = io_
27d0: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a  trace_callback;.
27e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
2800: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2810: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
2820: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
2830: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  TRING.**.** Invo
2840: 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ke the sqlite3_e
2850: 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e 74  xec_printf() int
2860: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
2870: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
2880: 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69  * DB.  The SQL i
2890: 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52  s the string FOR
28a0: 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74  MAT.  The format
28b0: 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63   string should c
28c0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73  ontain.** one %s
28d0: 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20   or %q.  STRING 
28e0: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73  is the value ins
28f0: 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72  erted into %s or
2900: 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   %q..*/.static i
2910: 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72 69  nt test_exec_pri
2920: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
2930: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2940: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2950: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2960: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2970: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2980: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
29c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
29d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
29e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
29f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2a00: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2a10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2a20: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
2a30: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
2a40: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2a50: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
2a60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a90: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2aa0: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52  .       " DB FOR
2ab0: 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b  MAT STRING", 0);
2ac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ad0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2ae0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2af0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2b00: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2b10: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
2b20: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
2b30: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2b40: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
2b50: 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72  ], argv[3]);.  r
2b60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2b70: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f  (db, zSql, exec_
2b80: 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c  printf_cb, &str,
2b90: 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74   &zErr);.  sqlit
2ba0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2bb0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2bc0: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
2bd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2be0: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54  terp, zBuf);.  T
2bf0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2c00: 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c  (interp, rc==SQL
2c10: 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74  ITE_OK ? Tcl_DSt
2c20: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20  ringValue(&str) 
2c30: 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44  : zErr);.  Tcl_D
2c40: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
2c50: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
2c60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2c70: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2c80: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
2c90: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
2ca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2cb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2cd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68    sqlite3_exec_h
2ce0: 65 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a  ex  DB  HEX.**.*
2cf0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
2d00: 69 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61  ite3_exec() on a
2d10: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
2d20: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e  obtained by tran
2d30: 73 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69  slating.** HEX i
2d40: 6e 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74  nto ASCII.  Most
2d50: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
2d60: 74 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73  translated as is
2d70: 2e 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a  .  %HH becomes.*
2d80: 2a 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65  * a hex characte
2d90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2da0: 20 74 65 73 74 5f 65 78 65 63 5f 68 65 78 28 0a   test_exec_hex(.
2db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2ea0: 20 72 63 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61   rc, i, j;.  cha
2eb0: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
2ec0: 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61  har *zHex;.  cha
2ed0: 72 20 7a 53 71 6c 5b 35 30 30 5d 3b 0a 20 20 63  r zSql[500];.  c
2ee0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2ef0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2f40: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2f50: 48 45 58 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  HEX", 0);.    re
2f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f70: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2f80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2f90: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2fb0: 0a 20 20 7a 48 65 78 20 3d 20 61 72 67 76 5b 32  .  zHex = argv[2
2fc0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  ];.  for(i=j=0; 
2fd0: 69 3c 73 69 7a 65 6f 66 28 7a 53 71 6c 29 20 26  i<sizeof(zSql) &
2fe0: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2ff0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
3000: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
3010: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
3020: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
3030: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
3040: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
3050: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
3060: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
3070: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
3080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3090: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
30a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
30b0: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
30c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
30d0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
30e0: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
30f0: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
3100: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
3110: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3120: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3130: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3140: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3150: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3160: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
3170: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
3180: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3190: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
31a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
31b0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
31c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
31d0: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
31e0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
31f0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3210: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3230: 3a 20 20 64 62 5f 65 6e 74 65 72 20 44 42 0a 2a  :  db_enter DB.*
3240: 2a 20 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  *         db_lea
3250: 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20 45 6e 74 65  ve DB.**.** Ente
3260: 72 20 6f 72 20 6c 65 61 76 65 20 74 68 65 20 6d  r or leave the m
3270: 75 74 65 78 20 6f 6e 20 61 20 64 61 74 61 62 61  utex on a databa
3280: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
3290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
32a0: 65 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e  enter(.  void *N
32b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
32c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
32d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
32e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
32f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3300: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3330: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3340: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3350: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3360: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3380: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
3390: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
33a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
33b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
33c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
33d0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
33e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
33f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3400: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3410: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3420: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3430: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3450: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
3460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3470: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  .}.static int db
3480: 5f 6c 65 61 76 65 28 0a 20 20 76 6f 69 64 20 2a  _leave(.  void *
3490: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
34a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
34b0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
34c0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
34d0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
34e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
34f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
3510: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
3520: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
3530: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
3540: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3550: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
3560: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3570: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3580: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3590: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
35a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
35b0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
35c0: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
35d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
35e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
35f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
3600: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
3610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3630: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
3640: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3660: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  :  sqlite3_exec 
3670: 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49   DB  SQL.**.** I
3680: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
3690: 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65  3_exec interface
36a0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
36b0: 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f 0a 73  database DB.*/.s
36c0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
36d0: 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  xec(.  void *Not
36e0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
36f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
3700: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
3710: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
3720: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3730: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3750: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3760: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
3770: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
3780: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3790: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
37a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
37b0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
37c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
37d0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
37e0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
37f0: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75  i, j;.  char zBu
3800: 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67  f[30];.  if( arg
3810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
3820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3830: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
3840: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
3850: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
3860: 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
3870: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3880: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
3890: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
38a0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
38b0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
38c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
38d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
38e0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
38f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
3900: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f  , argv[2]);.  fo
3910: 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b 69 5d  r(i=j=0; zSql[i]
3920: 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  ;){.    if( zSql
3930: 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [i]=='%' ){.    
3940: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 28 74    zSql[j++] = (t
3950: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
3960: 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73  [i+1])<<4) + tes
3970: 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69  tHexToInt(zSql[i
3980: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  +2]);.      i +=
3990: 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
39a0: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
39b0: 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20 20 20   zSql[i++];.    
39c0: 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a 5d 20  }.  }.  zSql[j] 
39d0: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
39e0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
39f0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
3a00: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
3a10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3a20: 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66  zSql);.  sprintf
3a30: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29  (zBuf, "%d", rc)
3a40: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
3a50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
3a60: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
3a70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3a80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
3a90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
3aa0: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
3ab0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3ac0: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
3ad0: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
3ae0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
3af0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
3b00: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
3b10: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
3b20: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
3b30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3b40: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
3b50: 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53  3_exec_nr  DB  S
3b60: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
3b70: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
3b80: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3b90: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3ba0: 73 65 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a  se DB.  Discard.
3bb0: 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a  ** all results.*
3bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3bd0: 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69  t_exec_nr(.  voi
3be0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3bf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3c00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3c10: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3c20: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3c30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3c40: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3c60: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3c70: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3c80: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3c90: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3ca0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3cb0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
3cc0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
3cd0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
3ce0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3cf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3d00: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3d10: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3d20: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
3d30: 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
3d40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3d50: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
3d60: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
3d70: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
3d80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3d90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3da0: 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
3db0: 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  ], 0, 0, &zErr);
3dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
3dd0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
3de0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
3df0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3e00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3e20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
3e30: 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54 4f  z_test  SEPARATO
3e40: 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e  R  ARG0  ARG1 ..
3e50: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ..**.** Test the
3e60: 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71   %z format of sq
3e70: 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20  lite_mprintf(). 
3e80: 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70   Use multiple mp
3e90: 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f  rintf() calls to
3ea0: 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65   .** concatenate
3eb0: 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61 72   arg0 through ar
3ec0: 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  gn using separat
3ed0: 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72 61  or as the separa
3ee0: 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  tor..** Return t
3ef0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
3f00: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70  atic int test_mp
3f10: 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20  rintf_z(.  void 
3f20: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3f30: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3f40: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3f50: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3f60: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3f70: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3f80: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3f90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3fa0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3fb0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3fc0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3fd0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3fe0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  {.  char *zResul
3ff0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
4000: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72  .  for(i=2; i<ar
4010: 67 63 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a  gc && (i==2 || z
4020: 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  Result); i++){. 
4030: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c     zResult = sql
4040: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
4050: 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20  %s%s", zResult, 
4060: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d  argv[1], argv[i]
4070: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
4080: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4090: 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  , zResult, 0);. 
40a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
40b0: 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
40c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
40d0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
40e0: 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
40f0: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54    STRING.**.** T
4100: 65 73 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61  est the %n forma
4110: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
4120: 6e 74 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74  ntf().  Return t
4130: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
4140: 0a 2a 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67  .** input string
4150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4160: 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a  test_mprintf_n(.
4170: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
4180: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4190: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
41a0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
41b0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
41c0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
41d0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4200: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
4210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4220: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4230: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
4240: 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d  *zStr;.  int n =
4250: 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c   0;.  zStr = sql
4260: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
4270: 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  %n", argv[1], &n
4280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
4290: 65 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53  e(zStr);.  Tcl_S
42a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
42b0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
42c0: 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(n));.  return 
42d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
42e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
42f0: 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53  _snprintf_int  S
4300: 49 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a  IZE FORMAT  INT.
4310: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f  **.** Test the o
4320: 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  f sqlite3_snprin
4330: 74 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  tf() routine.  S
4340: 49 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65 20  IZE is the size 
4350: 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
4360: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
4370: 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  .  The maximum s
4380: 69 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52  ize is 100.  FOR
4390: 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f  MAT is the.** fo
43a0: 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e  rmat string.  IN
43b0: 54 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  T is a single in
43c0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
43d0: 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73   The FORMAT.** s
43e0: 74 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69  tring must requi
43f0: 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  re no more than 
4400: 74 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72  this one integer
4410: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a   argument.  If.*
4420: 2a 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20  * You pass in a 
4430: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68  format string th
4440: 61 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65  at requires more
4450: 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65   than one argume
4460: 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67  nt,.** bad thing
4470: 73 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a  s will happen..*
4480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4490: 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a  t_snprintf_int(.
44a0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
44b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
44c0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
44d0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
44e0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
44f0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
4500: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
4510: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4520: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4530: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4550: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4560: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
4570: 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74  zStr[100];.  int
4580: 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31   n = atoi(argv[1
4590: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
45a0: 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76   *zFormat = argv
45b0: 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20  [2];.  int a1 = 
45c0: 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20  atoi(argv[3]);. 
45d0: 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53   if( n>sizeof(zS
45e0: 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66  tr) ) n = sizeof
45f0: 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zStr);.  sqlite
4600: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
4610: 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22  f(zStr), zStr, "
4620: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
4630: 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20  qrstuvwxyz");.  
4640: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4650: 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61  (n, zStr, zForma
4660: 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70  t, a1);.  Tcl_Ap
4670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4680: 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72  p, zStr, 0);.  r
4690: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
46a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
46b0: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a  OMIT_GET_TABLE..
46c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
46d0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
46e0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
46f0: 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e  AT  STRING  ?--n
4700: 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20  o-counts?.**.** 
4710: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
4720: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
4730: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
4740: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
4750: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
4760: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
4770: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
4780: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
4790: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
47a0: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
47b0: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
47c0: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
47d0: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
47e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
47f0: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
4800: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
4810: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4820: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4830: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4840: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4850: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4860: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4880: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4890: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
48a0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
48b0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
48c0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
48d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c  lite3 *db;.  Tcl
48e0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
48f0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
4900: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
4910: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
4920: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
4930: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
4940: 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[30];.  char *
4950: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43  zSql;.  int resC
4960: 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ount = -1;.  if(
4970: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
4980: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
4990: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
49a0: 26 72 65 73 43 6f 75 6e 74 29 20 29 20 72 65 74  &resCount) ) ret
49b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
49c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34   }.  if( argc!=4
49d0: 20 26 26 20 61 72 67 63 21 3d 35 20 29 7b 0a 20   && argc!=5 ){. 
49e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
49f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4a00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4a10: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4a20: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
4a30: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 20 3f 43  FORMAT STRING ?C
4a40: 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20  OUNT?", 0);.    
4a50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4a60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4a70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4a80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4aa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
4ab0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
4ac0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
4ad0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67  intf(argv[2],arg
4ae0: 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 61 72 67  v[3]);.  if( arg
4af0: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==5 ){.    rc =
4b00: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
4b10: 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52  le(db, zSql, &aR
4b20: 65 73 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45  esult, 0, 0, &zE
4b30: 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
4b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
4b50: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
4b60: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  l, &aResult, &nR
4b70: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72  ow, &nCol, &zErr
4b80: 29 3b 0a 20 20 20 20 72 65 73 43 6f 75 6e 74 20  );.    resCount 
4b90: 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b  = (nRow+1)*nCol;
4ba0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
4bb0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
4bc0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
4bd0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
4be0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4bf0: 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
4c00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4c10: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20      if( argc==4 
4c20: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
4c30: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f  (zBuf, "%d", nRo
4c40: 77 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  w);.      Tcl_Ap
4c50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4c60: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  rp, zBuf);.     
4c70: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
4c80: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
4c90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
4ca0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
4cb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4cc0: 28 69 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74  (i=0; i<resCount
4cd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
4ce0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4cf0: 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c 74 5b  interp, aResult[
4d00: 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20  i] ? aResult[i] 
4d10: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  : "NULL");.    }
4d20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
4d30: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4d40: 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20  interp, zErr);. 
4d50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
4d60: 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c 74 29  e_table(aResult)
4d70: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
4d80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
4d90: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
4da0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
4db0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
4dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4dd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4de0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
4df0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
4e00: 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55  BLE */.../*.** U
4e10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c  sage:  sqlite3_l
4e20: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4e30: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
4e40: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f  s the integer RO
4e50: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
4e60: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a  recent insert..*
4e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4e80: 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20  t_last_rowid(.  
4e90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4ea0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4eb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4ec0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4ed0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4ee0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4ef0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4f20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4f40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4f50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4f60: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
4f70: 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[30];..  if( ar
4f80: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4f90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4fa0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4fb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4fc0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
4fd0: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
4fe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4ff0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5000: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5010: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
5020: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5030: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
5040: 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33   "%lld", sqlite3
5050: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5060: 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  id(db));.  Tcl_A
5070: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5080: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
5090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
50b0: 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44  :  sqlite3_key D
50c0: 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20  B KEY.**.** Set 
50d0: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
50e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
50f0: 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  t_key(.  void *N
5100: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
5110: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
5120: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
5130: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
5140: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
5150: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5170: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
5180: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
5190: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
51a0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
51b0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
51c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
51d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
51e0: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
51f0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
5200: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5210: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
5220: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
5230: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
5240: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
5250: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
5260: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5270: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
5280: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
5290: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
52a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
52b0: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
52c0: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
52d0: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
52e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
52f0: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
5300: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
5310: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
5320: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5330: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5340: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
5350: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
5360: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
5370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
5380: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
5390: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
53a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
53b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
53c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
53d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
53e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
53f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5410: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5420: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5430: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5440: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5450: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
5460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5470: 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b  Key;.  int nKey;
5480: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
5490: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
54a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
54b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
54c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
54d0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
54e0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
54f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5500: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5510: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
5520: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
5530: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
5540: 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20  ERROR;.  zKey = 
5550: 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20  argv[2];.  nKey 
5560: 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a  = strlen(zKey);.
5570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
5580: 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65  S_CODEC.  sqlite
5590: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
55a0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
55b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
55c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
55d0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
55e0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
55f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
5600: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
5610: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
5620: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
5630: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
5640: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5650: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5660: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5670: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5680: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5690: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56b0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
56c0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
56d0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
56e0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
56f0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5700: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5710: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
5720: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
5730: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5740: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5750: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5760: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
5770: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
5780: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
57a0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
57b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
57c0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
57d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
57e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
57f0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
5800: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
5810: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
5820: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
5830: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
5840: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
5850: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5860: 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65  f the x_coalesce
5870: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  () function..** 
5880: 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  Return the first
5890: 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55   argument non-NU
58a0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
58b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69  static void t1_i
58c0: 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c  fnullFunc(.  sql
58d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
58e0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
58f0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5900: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5910: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5920: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55     if( SQLITE_NU
5940: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
5950: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20  e_type(argv[i]) 
5960: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
5970: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5980: 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20  ytes(argv[i]);. 
5990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
59a0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
59b0: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
59c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
59d0: 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [i]),.          
59e0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
59f0: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
5a00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
5a10: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
5a20: 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20  test functions. 
5a30: 20 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70     hex8() interp
5a40: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5a50: 74 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64  t as.** UTF8 and
5a60: 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65   returns a hex e
5a70: 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c  ncoding.  hex16l
5a80: 65 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  e() interprets i
5a90: 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61  ts argument.** a
5aa0: 73 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65  s UTF16le and re
5ab0: 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f  turns a hex enco
5ac0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
5ad0: 76 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71  void hex8Func(sq
5ae0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
5af0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
5b00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5b10: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
5b20: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ned char *z;.  i
5b30: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75  nt i;.  char zBu
5b40: 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71  f[200];.  z = sq
5b50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5b60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72  (argv[0]);.  for
5b70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  (i=0; i<sizeof(z
5b80: 42 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b  Buf)/2 - 2 && z[
5b90: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  i]; i++){.    sp
5ba0: 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d  rintf(&zBuf[i*2]
5bb0: 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30  , "%02x", z[i]&0
5bc0: 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  xff);.  }.  zBuf
5bd0: 5b 69 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  [i*2] = 0;.  sql
5be0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5bf0: 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c  (p, (char*)zBuf,
5c00: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
5c10: 53 49 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65  SIENT);.}.#ifnde
5c20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
5c30: 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
5c40: 68 65 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65  hex16Func(sqlite
5c50: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e  3_context *p, in
5c60: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5c70: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
5c80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5c90: 73 68 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20  short int *z;.  
5ca0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
5cb0: 75 66 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73  uf[400];.  z = s
5cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5cd0: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t16(argv[0]);.  
5ce0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
5cf0: 66 28 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26  f(zBuf)/4 - 4 &&
5d00: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
5d10: 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69   sprintf(&zBuf[i
5d20: 2a 34 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69  *4], "%04x", z[i
5d30: 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a  ]&0xff);.  }.  z
5d40: 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20  Buf[i*4] = 0;.  
5d50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5d60: 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42  ext(p, (char*)zB
5d70: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
5d80: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e  RANSIENT);.}.#en
5d90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  dif../*.** A str
5da0: 75 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63  ucture into whic
5db0: 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  h to accumulate 
5dc0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  text..*/.struct 
5dd0: 64 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c  dstr {.  int nAl
5de0: 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61  loc;  /* Space a
5df0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
5e00: 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70  t nUsed;   /* Sp
5e10: 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68  ace used */.  ch
5e20: 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68  ar *z;     /* Th
5e30: 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f  e space */.};../
5e40: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
5e50: 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74   to a dstr.*/.st
5e60: 61 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70  atic void dstrAp
5e70: 70 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72  pend(struct dstr
5e80: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5e90: 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29  *z, int divider)
5ea0: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  {.  int n = strl
5eb0: 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  en(z);.  if( p->
5ec0: 6e 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20  nUsed + n + 2 > 
5ed0: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
5ee0: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20   char *zNew;.   
5ef0: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e   p->nAlloc = p->
5f00: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32  nAlloc*2 + n + 2
5f10: 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73  00;.    zNew = s
5f20: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
5f30: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
5f40: 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30  .    if( zNew==0
5f50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5f60: 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  3_free(p->z);.  
5f70: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
5f80: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
5f90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5fa0: 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65  }.    p->z = zNe
5fb0: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76  w;.  }.  if( div
5fc0: 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64  ider && p->nUsed
5fd0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70  >0 ){.    p->z[p
5fe0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76  ->nUsed++] = div
5ff0: 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ider;.  }.  memc
6000: 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65  py(&p->z[p->nUse
6010: 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70  d], z, n+1);.  p
6020: 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a  ->nUsed += n;.}.
6030: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66  ./*.** Invoked f
6040: 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b  or each callback
6050: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65   from sqlite3Exe
6060: 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20  cFunc.*/.static 
6070: 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c  int execFuncCall
6080: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
6090: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
60a0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
60b0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75  NotUsed){.  stru
60c0: 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74  ct dstr *p = (st
60d0: 72 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61  ruct dstr*)pData
60e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
60f0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
6100: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76  +){.    if( argv
6110: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
6120: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e  dstrAppend(p, "N
6130: 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20  ULL", ' ');.    
6140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74  }else{.      dst
6150: 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b  rAppend(p, argv[
6160: 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a  i], ' ');.    }.
6170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6180: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
6190: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
61a0: 5f 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66  _sqlite_exec() f
61b0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
61c0: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a  unction takes.**
61d0: 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
61e0: 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20  nt and attempts 
61f0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
6200: 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20  argument as SQL 
6210: 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  code..** This is
6220: 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f   illegal and sho
6230: 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49  uld set the SQLI
6240: 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f  TE_MISUSE flag o
6250: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
6260: 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30  **.** 2004-Jan-0
6270: 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e  7:  We have chan
6280: 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65  ged this to make
6290: 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c   it legal to cal
62a0: 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  l sqlite3_exec()
62b0: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
62c0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
62d0: 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72    .** .** This r
62e0: 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73  outine simulates
62f0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68   the effect of h
6300: 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64  aving two thread
6310: 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  s attempt to.** 
6320: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6330: 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d  abase at the sam
6340: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e time..*/.stati
6350: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
6360: 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ecFunc(.  sqlite
6370: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6380: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
6390: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
63a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
63b0: 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20  truct dstr x;.  
63c0: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
63d0: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69  zeof(x));.  (voi
63e0: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28  d)sqlite3_exec((
63f0: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
6400: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
6410: 78 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72  xt),.      (char
6420: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6430: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20  text(argv[0]),. 
6440: 20 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c       execFuncCal
6450: 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20  lback, &x, 0);. 
6460: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6470: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e  text(context, x.
6480: 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49  z, x.nUsed, SQLI
6490: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
64a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e   sqlite3_free(x.
64b0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  z);.}../*.** Imp
64c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
64d0: 6b 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20  kt2213func(), a 
64e0: 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
64f0: 74 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74  that takes exact
6500: 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65  ly.** one argume
6510: 6e 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69  nt. It has two i
6520: 6e 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75  nteresting featu
6530: 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20  res:.**.** * It 
6540: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61  calls sqlite3_va
6550: 6c 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d  lue_text() 3 tim
6560: 65 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  es on the argume
6570: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
6580: 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74  *..**   If the t
6590: 68 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65  hree pointers re
65a0: 74 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74  turned are not t
65b0: 68 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65  he same an SQL e
65c0: 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a  rror is raised..
65d0: 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73  **.** * Otherwis
65e0: 65 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63  e it returns a c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20  opy of the text 
6600: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6610: 66 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75  f its .**   argu
6620: 6d 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77  ment in such a w
6630: 61 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72  ay as the VDBE r
6640: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
6650: 20 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a   a Mem* cell .**
6660: 20 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f     with the MEM_
6670: 54 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e  Term flag clear.
6680: 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23   .**.** Ticket #
6690: 32 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f  2213 can therefo
66a0: 72 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20  re be tested by 
66b0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66  evaluating the f
66c0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20  ollowing.** SQL 
66d0: 65 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a  expression:.**.*
66e0: 2a 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28  *   tkt2213func(
66f0: 74 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73  tkt2213func('a s
6700: 74 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61  tring'));.*/.sta
6710: 74 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33  tic void tkt2213
6720: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
6730: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6740: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
6750: 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  c,  .  sqlite3_v
6760: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6770: 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e   int nText;.  un
6780: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
6790: 74 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73  t *zText1;.  uns
67a0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
67b0: 20 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69   *zText2;.  unsi
67c0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
67d0: 2a 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78  *zText3;..  nTex
67e0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
67f0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6800: 3b 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c  ;.  zText1 = sql
6810: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6820: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
6830: 74 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t2 = sqlite3_val
6840: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6850: 3b 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c  ;.  zText3 = sql
6860: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6870: 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28  argv[0]);..  if(
6880: 20 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20   zText1!=zText2 
6890: 7c 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74  || zText2!=zText
68a0: 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
68b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
68c0: 6e 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20  ntext, "tkt2213 
68d0: 69 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d  is not fixed", -
68e0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
68f0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28   char *zCopy = (
6900: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
6910: 61 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20  alloc(nText);.  
6920: 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
6930: 7a 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a  zText1, nText);.
6940: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6950: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6960: 20 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73   zCopy, nText, s
6970: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  }.}../*.** The f
6990: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e  ollowing SQL fun
69a0: 63 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72  ction takes 4 ar
69b0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e  guments.  The 2n
69c0: 64 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67  d and.** 4th arg
69d0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e  ument must be on
69e0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e  e of these strin
69f0: 67 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65  gs:  'text', 'te
6a00: 78 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c  xt16',.** or 'bl
6a10: 6f 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ob' correspondin
6a20: 67 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  g to API functio
6a30: 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  ns.**.**      sq
6a40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6a50: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
6a60: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6a70: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6a80: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a  3_value_blob().*
6a90: 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
6aa0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72  rgument is a str
6ab0: 69 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74  ing, either 'byt
6ac0: 65 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27  es' or 'bytes16'
6ad0: 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63   or 'noop',.** c
6ae0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6af0: 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  APIs:.**.**     
6b00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6b10: 79 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73  ytes().**      s
6b20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6b30: 65 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e  es16().**      n
6b40: 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50  oop.**.** The AP
6b50: 49 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79  Is designated by
6b60: 20 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68   the 2nd through
6b70: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61   4th arguments a
6b80: 72 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f  re applied.** to
6b90: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6ba0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49  ent in order.  I
6bb0: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72  f the pointers r
6bc0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
6bd0: 2a 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75  * second and fou
6be0: 72 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e  rth are differen
6bf0: 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
6c00: 72 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65  returns 1.  Othe
6c10: 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72  rwise,.** this r
6c20: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
6c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
6c40: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
6c50: 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
6c60: 6e 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  n returned point
6c70: 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ers from.** the 
6c80: 5f 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36  _text(), _text16
6c90: 28 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41  () and _blob() A
6ca0: 50 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  PIs become inval
6cb0: 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
6cc0: 63 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75  c void ptrChngFu
6cd0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
6ce0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6cf0: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
6d00: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
6d10: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
6d20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a  onst void *p1, *
6d30: 70 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p2;.  const char
6d40: 20 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72   *zCmd;.  if( ar
6d50: 67 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a  gc!=4 ) return;.
6d60: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
6d70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
6d80: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6d90: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
6da0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6db0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65   strcmp(zCmd,"te
6dc0: 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  xt")==0 ){.    p
6dd0: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
6de0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6df0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  ext(argv[0]);.#i
6e00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6e10: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
6e20: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6e30: 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b   "text16")==0 ){
6e40: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
6e50: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6e60: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
6e70: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
6e80: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6e90: 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30  zCmd, "blob")==0
6ea0: 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f   ){.    p1 = (co
6eb0: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
6ec0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
6ed0: 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[0]);.  }else{.
6ee0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6ef0: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
6f00: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
6f10: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
6f20: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
6f30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6f40: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79   strcmp(zCmd,"by
6f50: 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
6f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6f70: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  tes(argv[0]);.#i
6f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6f90: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
6fa0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6fb0: 20 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29   "bytes16")==0 )
6fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
6fd0: 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76  lue_bytes16(argv
6fe0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
6ff0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7000: 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30  zCmd, "noop")==0
7010: 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f   ){.    /* do no
7020: 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
7030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7040: 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73  }.  zCmd = (cons
7050: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
7060: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7070: 33 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  3]);.  if( zCmd=
7080: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7090: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22  f( strcmp(zCmd,"
70a0: 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  text")==0 ){.   
70b0: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
70c0: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
70d0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
70e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
70f0: 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73  MIT_UTF16.  }els
7100: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
7110: 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20  d, "text16")==0 
7120: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
7130: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
7140: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
7150: 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  gv[0]);.#endif. 
7160: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7170: 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d  p(zCmd, "blob")=
7180: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28  =0 ){.    p2 = (
7190: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
71a0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
71b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[0]);.  }else
71c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
71d0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
71e0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
71f0: 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p1!=p2);.}.../*.
7200: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
7210: 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  e_test_create_fu
7220: 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20  nction DB.**.** 
7230: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7240: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7250: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7260: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7270: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7280: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7290: 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20  d "x_coalesce". 
72a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
72b0: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69  oes the same thi
72c0: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f  ng.** as the "co
72d0: 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e  alesce" function
72e0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
72f0: 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20   also registers 
7300: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a  an SQL function.
7310: 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69  ** named "x_sqli
7320: 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e  te_exec" that in
7330: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78  vokes sqlite3_ex
7340: 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20  ec().  Invoking 
7350: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
7360: 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73  * in this way is
7370: 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69   illegal recursi
7380: 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61  on and should ra
7390: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
73a0: 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54  SUSE error..** T
73b0: 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d  he effect is sim
73c0: 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74  ilar to trying t
73d0: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
73e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
73f0: 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74  on from.** two t
7400: 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61  hreads at the sa
7410: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  me time..**.** T
7420: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
7430: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
7440: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
7450: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
7460: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
7470: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75  eate_function fu
7480: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
7490: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
74a0: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
74b0: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
74c0: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
74d0: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ion logic..*/.st
74e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
74f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
7500: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7510: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7520: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7530: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7540: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7550: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7560: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7570: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7580: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7590: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
75a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
75b0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
75c0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
75d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
75e0: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
75f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7600: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7610: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7620: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7630: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7640: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
7650: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7660: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
7670: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7680: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
7690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
76a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
76b0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
76c0: 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65  (db, "x_coalesce
76d0: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e  ", -1, SQLITE_AN
76e0: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74  Y, 0, .        t
76f0: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c  1_ifnullFunc, 0,
7700: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7720: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7730: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7740: 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49   "hex8", 1, SQLI
7750: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7760: 20 20 20 20 20 20 68 65 78 38 46 75 6e 63 2c 20        hex8Func, 
7770: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  0, 0);.  }.#ifnd
7780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7790: 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d 53  TF16.  if( rc==S
77a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
77c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
77d0: 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51 4c   "hex16", 1, SQL
77e0: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
77f0: 20 20 20 20 20 20 20 68 65 78 31 36 46 75 6e 63         hex16Func
7800: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
7810: 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
7820: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7830: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7840: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7850: 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31  "tkt2213func", 1
7860: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7870: 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32   .          tkt2
7880: 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  213Function, 0, 
7890: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
78a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
78b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
78c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
78d0: 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61  db, "pointer_cha
78e0: 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  nge", 4, SQLITE_
78f0: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
7900: 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69     ptrChngFuncti
7910: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  on, 0, 0);.  }..
7920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7930: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55  MIT_UTF16.  /* U
7940: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  se the sqlite3_c
7950: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7960: 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69  () API here. Mai
7970: 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74  nly for fun, but
7980: 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61   also .  ** beca
7990: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65  use it is not te
79a0: 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c  sted anywhere el
79b0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  se. */.  if( rc=
79c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
79d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55    const void *zU
79e0: 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65  tf16;.    sqlite
79f0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
7a00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
7a10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
7a20: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  );.    pVal = sq
7a30: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
7a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
7a50: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
7a60: 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78  -1, "x_sqlite_ex
7a70: 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ec", SQLITE_UTF8
7a80: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7a90: 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73  ;.    zUtf16 = s
7aa0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
7ab0: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
7ac0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69  16NATIVE);.    i
7ad0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7ae0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
7af0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7b20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
7b30: 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20  db, zUtf16, .   
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
7b50: 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62  SQLITE_UTF16, db
7b60: 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  , sqlite3ExecFun
7b70: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
7b90: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  Free(pVal);.    
7ba0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7bb0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7bc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
7bd0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
7be0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
7bf0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
7c00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
7c10: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
7c20: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
7c30: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
7c40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7c50: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
7c60: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
7c70: 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72  e x_count() aggr
7c80: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
7c90: 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20  **.** x_count() 
7ca0: 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65  counts the numbe
7cb0: 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72  r of non-null ar
7cc0: 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68  guments.  But th
7cd0: 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20  ere are.** some 
7ce0: 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74 69  twists for testi
7cf0: 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a  ng purposes..**.
7d00: 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  ** If the argume
7d10: 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20  nt to x_count() 
7d20: 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54 46  is 40 then a UTF
7d30: 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  -8 error is repo
7d40: 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  rted.** on the s
7d50: 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  tep function.  I
7d60: 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73  f x_count(41) is
7d70: 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54   seen, then a UT
7d80: 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73  F-16 error.** is
7d90: 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65   reported on the
7da0: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20   step function. 
7db0: 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f   If the total co
7dc0: 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a  unt is 42, then.
7dd0: 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72  ** a UTF-8 error
7de0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
7df0: 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e  the finalize fun
7e00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ction..*/.typede
7e10: 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74  f struct t1Count
7e20: 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a  Ctx t1CountCtx;.
7e30: 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74  struct t1CountCt
7e40: 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a  x {.  int n;.};.
7e50: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f  static void t1Co
7e60: 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  untStep(.  sqlit
7e70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7e80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7e90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7ea0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43   **argv.){.  t1C
7eb0: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7ec0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7ed0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ee0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7ef0: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
7f00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
7f10: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
7f20: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26  ype(argv[0]) ) &
7f30: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
7f40: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  +;.  }.  if( arg
7f50: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  c>0 ){.    int v
7f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7f70: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
7f80: 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a     if( v==40 ){.
7f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7fa0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
7fb0: 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30  xt, "value of 40
7fc0: 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75   handed to x_cou
7fd0: 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65  nt", -1);.#ifnde
7fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7ff0: 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F16.    }else if
8000: 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20  ( v==41 ){.     
8010: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66   const char zUtf
8020: 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30  16ErrMsg[] = { 0
8030: 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c  , 0x61, 0, 0x62,
8040: 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20   0, 0x63, 0, 0, 
8050: 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0};.      sqlite
8060: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36  3_result_error16
8070: 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31  (context, &zUtf1
8080: 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45  6ErrMsg[1-SQLITE
8090: 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29  _BIGENDIAN], -1)
80a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
80b0: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
80c0: 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c  oid t1CountFinal
80d0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
80e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
80f0: 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a   t1CountCtx *p;.
8100: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
8110: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8120: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
8130: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
8140: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34  .    if( p->n==4
8150: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
8160: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8170: 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e  context, "x_coun
8180: 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c  t totals to 42",
8190: 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   -1);.    }else{
81a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
81b0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
81c0: 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29  t, p ? p->n : 0)
81d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
81e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81f0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73 74  IT_DEPRECATED.st
8200: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
8210: 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c  CountStep(.  sql
8220: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8230: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8240: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8250: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f  ue **argv.){.  /
8260: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74  * no-op */.}..st
8270: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
8280: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
8290: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
82a0: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
82b0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
82c0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61  ntext, sqlite3_a
82d0: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63  ggregate_count(c
82e0: 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e 64  ontext));.}.#end
82f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
8300: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8310: 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a  _aggregate DB.**
8320: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
8330: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8340: 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20  tion API on the 
8350: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69  given database i
8360: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72  n order.** to cr
8370: 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  eate a function 
8380: 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e  named "x_count".
8390: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
83a0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
83b0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f   the built-in co
83c0: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20  unt() function, 
83d0: 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63 69  with a few speci
83e0: 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f 72  al quirks.** for
83f0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c   testing the sql
8400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8410: 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20  r() APIs..**.** 
8420: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
8430: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
8440: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
8450: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
8460: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
8470: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
8480: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
8490: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
84a0: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
84b0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
84c0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
84d0: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65  ction logic.  Se
84e0: 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a  e misuse.test..*
84f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8500: 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65  e was later exte
8510: 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  nded to test the
8520: 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   use of sqlite3_
8530: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a  result_error().*
8540: 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61  * within aggrega
8550: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  te functions..**
8560: 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69 73  .** Later: It is
8570: 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e 64   now also extend
8580: 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  ed to register t
8590: 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
85a0: 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63 79  ction.** "legacy
85b0: 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20 74  _count()" with t
85c0: 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74 61  he supplied data
85d0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
85e0: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
85f0: 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63 61  test the depreca
8600: 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72  ted sqlite3_aggr
8610: 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50  egate_count() AP
8620: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  I..*/.static int
8630: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67   test_create_agg
8640: 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  regate(.  void *
8650: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8660: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8670: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8680: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8690: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
86a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
86b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
86c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
86d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
86e0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
86f0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8700: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
8730: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8750: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8760: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8770: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8780: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
8790: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
87a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
87b0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
87c0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
87d0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
87e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
87f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
8800: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
8810: 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c  b, "x_count", 0,
8820: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
8830: 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75 6e   0,.      t1Coun
8840: 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e  tStep,t1CountFin
8850: 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  alize);.  if( rc
8860: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8870: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8880: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8890: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31  db, "x_count", 1
88a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
88b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31 43  , 0,.        t1C
88c0: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
88d0: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23  Finalize);.  }.#
88e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
88f0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
8900: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8910: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
8920: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8930: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61 63  ction(db, "legac
8940: 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  y_count", 0, SQL
8950: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a 20  ITE_ANY, 0, 0,. 
8960: 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f 75         legacyCou
8970: 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43 6f  ntStep, legacyCo
8980: 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20 20  untFinalize.    
8990: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
89a0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
89b0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
89c0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
89d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
89e0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
89f0: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
8a00: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
8a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8a20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
8a30: 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a 2a  :  printf TEXT.*
8a40: 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75 74  *.** Send output
8a50: 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73 65   to printf.  Use
8a60: 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68 61   this rather tha
8a70: 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65 20  n puts to merge 
8a80: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 6e  the output.** in
8a90: 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65 71   the correct seq
8aa0: 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75 67  uence with debug
8ab0: 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e 73  ging printfs ins
8ac0: 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f 64  erted into C cod
8ad0: 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73 20  e..** Puts uses 
8ae0: 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66 65  a separate buffe
8af0: 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  r and debugging 
8b00: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c 20  statements will 
8b10: 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65 71  be out of.** seq
8b20: 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20 75  uence if it is u
8b30: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
8b40: 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28 0a  nt test_printf(.
8b50: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
8b60: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8b70: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
8b80: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
8b90: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8ba0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
8bb0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
8bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8bd0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
8be0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
8c00: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
8c10: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61  nt */.){.  if( a
8c20: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
8c30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8c40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8c50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8c60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8c70: 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20       " TEXT\"", 
8c80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8c90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8ca0: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61  printf("%s\n", a
8cb0: 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72  rgv[1]);.  retur
8cc0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  n TCL_OK;.}..../
8cd0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8ce0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8cf0: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
8d00: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
8d10: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
8d20: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69 6e  tf with three in
8d30: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a  teger arguments.
8d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
8d50: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8d60: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8d70: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8d80: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8d90: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8da0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8db0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8dc0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8de0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8df0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8e00: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8e10: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8e20: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8e30: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8e40: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8e50: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8e60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8e70: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8e80: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8e90: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8ea0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8eb0: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8ed0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8ee0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8ef0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8f00: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8f10: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8f20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8f30: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8f40: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8f50: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8f60: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8f70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8f80: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8f90: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8fa0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8fb0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8fc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8fd0: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8fe0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8ff0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
9000: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
9010: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
9020: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
9030: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
9040: 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20  printf_int64(.  
9050: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
9060: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9070: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
9080: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
9090: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
90a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
90b0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
90e0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
9100: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
9110: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
9120: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61    sqlite_int64 a
9130: 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [3];.  char *z;.
9140: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
9150: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9160: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9170: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9180: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9190: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
91a0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
91b0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
91c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
91d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
91e0: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
91f0: 20 21 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28   !sqlite3Atoi64(
9200: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
9210: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
9220: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9230: 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69 73  rp, "argument is
9240: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34 2d   not a valid 64-
9250: 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30 29  bit integer", 0)
9260: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9270: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9280: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9290: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
92a0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
92b0: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
92c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
92d0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
92e0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
92f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9300: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9310: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
9320: 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  g FORMAT INTEGER
9330: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9340: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9350: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 6c  ntf with three l
9360: 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75  ong integer argu
9370: 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d 69  ments.   This mi
9380: 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ght be the.** sa
9390: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d 70  me as sqlite3_mp
93a0: 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c  rintf_int or sql
93b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
93c0: 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  64, depending on
93d0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f  .** platform..*/
93e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
93f0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
9400: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9410: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9420: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9430: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9440: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9450: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9460: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9480: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9490: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
94b0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
94c0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
94d0: 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61   i;.  long int a
94e0: 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b  [3];.  int b[3];
94f0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9500: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
9510: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9520: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9530: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9540: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9550: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9560: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
9570: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9580: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9590: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
95a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
95b0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
95c0: 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d  argv[i], &b[i-2]
95d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
95e0: 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  RROR;.    a[i-2]
95f0: 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69   = (long int)b[i
9600: 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20  -2];.    a[i-2] 
9610: 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28 73  &= (((u64)1)<<(s
9620: 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31  izeof(int)*8))-1
9630: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
9640: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
9650: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
9660: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
9670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9680: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9690: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
96a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
96b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
96c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
96d0: 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  tr FORMAT INTEGE
96e0: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
96f0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9700: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9710: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9720: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
9730: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9740: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
9750: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9760: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9770: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9780: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9790: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
97a0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
97b0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
97c0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
97d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
97e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
97f0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
9800: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9810: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9820: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9830: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9840: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9850: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9860: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9870: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9880: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9890: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
98a0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
98b0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
98c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
98d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
98e0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
98f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9900: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9910: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9920: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9930: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9940: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9950: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9960: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9970: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9980: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9990: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
99a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
99b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
99c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
99d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
99e0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
99f0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
9a00: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9a10: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9a20: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9a30: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9a40: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9a50: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9a60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  int sqlite3_snpr
9a70: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9a80: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9a90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9aa0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9ab0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9ac0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9ad0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9ae0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9b00: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
9b10: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
9b20: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9b30: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9b40: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9b50: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
9b60: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9b70: 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a  <5 || argc>6 ){.
9b80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9b90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9ba0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9bb0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9bc0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54  0],.       " INT
9bd0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
9be0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
9bf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9c00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9c10: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9c20: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  rp, argv[1], &n)
9c30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9c40: 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  ROR;.  if( n<0 )
9c50: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9c60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9c70: 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  N must be non-ne
9c80: 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20  gative", 0);.   
9c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9ca0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33  R;.  }.  for(i=3
9cb0: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
9cc0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
9cd0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
9ce0: 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75   &a[i-3]) ) retu
9cf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9d00: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
9d10: 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  malloc( n+1 );. 
9d20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9d30: 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c  f(n, z, argv[2],
9d40: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67   a[0], a[1], arg
9d50: 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20  c>4 ? argv[5] : 
9d60: 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70  NULL);.  Tcl_App
9d70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9d80: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9d90: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9da0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9db0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9dc0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
9dd0: 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45  uble FORMAT INTE
9de0: 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42  GER INTEGER DOUB
9df0: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
9e00: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
9e10: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9e20: 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20   and one double 
9e30: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9e40: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
9e50: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20  printf_double(. 
9e60: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9e70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9e80: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9e90: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9ea0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9eb0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9ec0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9ed0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9ee0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9ef0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9f10: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9f20: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9f30: 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  3], i;.  double 
9f40: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  r;.  char *z;.  
9f50: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
9f60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9f70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9f80: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9f90: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9fa0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9fb0: 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c  AT INT INT DOUBL
9fc0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
9fd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9fe0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9ff0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
a000: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
a010: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
a020: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
a030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a040: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
a050: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
a060: 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e  4], &r) ) return
a070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20   TCL_ERROR;.  z 
a080: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a090: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
a0a0: 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c   a[1], r);.  Tcl
a0b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a0c0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
a0d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
a0e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
a100: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
a110: 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20  f_scaled FORMAT 
a120: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a  DOUBLE DOUBLE.**
a130: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
a140: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64   with a single d
a150: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ouble argument w
a160: 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64  hich is the prod
a170: 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  uct of the.** tw
a180: 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65  o arguments give
a190: 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69  n above.  This i
a1a0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
a1b0: 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20  te overflow and 
a1c0: 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75  underflow.** dou
a1d0: 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61  bles to test tha
a1e0: 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65  t they are conve
a1f0: 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  rted properly..*
a200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
a210: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
a220: 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  led(.  void *Not
a230: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a240: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a250: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a260: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a270: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a280: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a2a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a2b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a2c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a2d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a2e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a2f0: 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  int i;.  double 
a300: 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  r[2];.  char *z;
a310: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29  .  if( argc!=4 )
a320: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a330: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a340: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a350: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
a360: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
a370: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
a380: 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  BLE\"", 0);.    
a390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a3a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
a3b0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
a3c0: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
a3d0: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  e(interp, argv[i
a3e0: 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65  ], &r[i-2]) ) re
a3f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a400: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
a410: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
a420: 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20  ], r[0]*r[1]);. 
a430: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a440: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a450: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a460: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a480: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a490: 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f  rintf_stronly FO
a4a0: 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a  RMAT STRING.**.*
a4b0: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a4c0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a4d0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a4e0: 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63  ch is the produc
a4f0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  t of the.** two 
a500: 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20  arguments given 
a510: 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20  above.  This is 
a520: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
a530: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e   overflow and un
a540: 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c  derflow.** doubl
a550: 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  es to test that 
a560: 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74  they are convert
a570: 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ed properly..*/.
a580: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
a590: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
a5a0: 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ly(.  void *NotU
a5b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a5c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a5d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a5e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a5f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a600: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a620: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a630: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a640: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a650: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a660: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
a670: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a680: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
a690: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a6a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a6b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a6c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a6d0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52      " FORMAT STR
a6e0: 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ING\"", 0);.    
a6f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a700: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
a710: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a720: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20  [1], argv[2]);. 
a730: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a740: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a750: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a760: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a770: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a780: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a790: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20  rintf_hexdouble 
a7a0: 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a  FORMAT HEX.**.**
a7b0: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a7c0: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a7d0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a7e0: 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f  h is derived fro
a7f0: 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63  m the.** hexadec
a800: 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66  imal encoding of
a810: 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e   an IEEE double.
a820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a830: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
a840: 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  exdouble(.  void
a850: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
a860: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a870: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a880: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a890: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a8a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
a8b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
a8c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a8d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a8e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a8f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a900: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a910: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
a920: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69  double r;.  unsi
a930: 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b  gned int x1, x2;
a940: 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  .  sqlite_uint64
a950: 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   d;.  if( argc!=
a960: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
a970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a980: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a990: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
a9a0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
a9b0: 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c  " FORMAT STRING\
a9c0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
a9d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a9e0: 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 61  }.  if( sscanf(a
a9f0: 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38  rgv[2], "%08x%08
aa00: 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32  x", &x2, &x1)!=2
aa10: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
aa20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aa30: 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73   "2nd argument s
aa40: 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72  hould be 16-char
aa50: 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20  acters of hex", 
aa60: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
aa70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
aa80: 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64  d = x2;.  d = (d
aa90: 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65  <<32) + x1;.  me
aaa0: 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a  mcpy(&r, &d, siz
aab0: 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73  eof(r));.  z = s
aac0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
aad0: 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  rgv[1], r);.  Tc
aae0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
aaf0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
ab00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
ab10: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ab20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ab30: 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  : sqlite3_enable
ab40: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42  _shared_cache ?B
ab50: 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69  OOLEAN?.**.*/.#i
ab60: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ab70: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ab80: 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20  CHE).static int 
ab90: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72  test_enable_shar
aba0: 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ed(.  ClientData
abb0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
abc0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
abd0: 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
abe0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
abf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ac00: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
ac10: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
ac20: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
ac30: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
ac40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ac50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ac60: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
ac70: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ac80: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
ac90: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
aca0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e  int rc;.  int en
acb0: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20  able;.  int ret 
acc0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
acd0: 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29  !=2 && objc!=1 )
ace0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
acf0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ad00: 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41  , objv, "?BOOLEA
ad10: 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
ad20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ad30: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 47    ret = sqlite3G
ad40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
ad50: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a  edCacheEnabled;.
ad60: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
ad70: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
ad80: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
ad90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
ada0: 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20   &enable) ){.   
adb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
adc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
add0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  c = sqlite3_enab
ade0: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28  le_shared_cache(
adf0: 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  enable);.    if(
ae00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ae10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
ae20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
ae30: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
ae40: 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  Str(rc), TCL_STA
ae50: 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  TIC);.      retu
ae60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ae70: 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65    }.  }.  Tcl_Se
ae80: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ae90: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
aea0: 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65  nObj(ret));.  re
aeb0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
aec0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  endif..../*.** U
aed0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
aee0: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
aef0: 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c  des   DB    BOOL
af00: 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  EAN.**.*/.static
af10: 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64   int test_extend
af20: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
af30: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
af40: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
af50: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
af60: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
af70: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
af80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
af90: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
afa0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
afb0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
afc0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afe0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
aff0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b000: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b010: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b020: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
b030: 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74   enable;.  sqlit
b040: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f  e3 *db;..  if( o
b050: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
b060: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b070: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b080: 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  "DB BOOLEAN");. 
b090: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b0a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
b0b0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
b0c0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b0d0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
b0e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b0f0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
b100: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
b110: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b120: 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74  , &enable) ) ret
b130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b140: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
b150: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64  d_result_codes(d
b160: 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65  b, enable);.  re
b170: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b180: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b190: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
b1a0: 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61  number.**.*/.sta
b1b0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62  tic int test_lib
b1c0: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b1d0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b1e0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b1f0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b200: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b210: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b220: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b230: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b240: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b250: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b260: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b280: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b290: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b2a0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b2b0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b2c0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b2d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b2e0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b2f0: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b300: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b310: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b320: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b330: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b340: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b350: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b360: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b380: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b390: 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74  ADATA.static int
b3a0: 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
b3b0: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43  mn_metadata(.  C
b3c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
b3d0: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
b3e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
b3f0: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
b400: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
b410: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
b420: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
b430: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
b440: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
b450: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
b460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b470: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b480: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b490: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b4a0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b4b0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b4c0: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
b4d0: 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74  ar *zDb;.  const
b4e0: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
b4f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b  onst char *zCol;
b500: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c  .  int rc;.  Tcl
b510: 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63  _Obj *pRet;..  c
b520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
b530: 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  type;.  const ch
b540: 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20  ar *zCollseq;.  
b550: 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  int notnull;.  i
b560: 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20  nt primarykey;. 
b570: 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65   int autoincreme
b580: 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  nt;..  if( objc!
b590: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
b5a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b5b0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
b5c0: 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63  dbname tblname c
b5d0: 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65  olname");.    re
b5e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5f0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
b600: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
b610: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b620: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
b630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b640: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
b650: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
b660: 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74    zTbl = Tcl_Get
b670: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
b680: 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65  .  zCol = Tcl_Ge
b690: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
b6a0: 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28  ;..  if( strlen(
b6b0: 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20  zDb)==0 ) zDb = 
b6c0: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
b6d0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
b6e0: 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62  metadata(db, zDb
b6f0: 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20  , zTbl, zCol, . 
b700: 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c       &zDatatype,
b710: 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74   &zCollseq, &not
b720: 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65  null, &primaryke
b730: 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e  y, &autoincremen
b740: 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  t);..  if( rc!=S
b750: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b760: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b770: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
b780: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
b790: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b7a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52  ERROR;.  }..  pR
b7b0: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
b7c0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b7d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b7e0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b7f0: 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70  ringObj(zDatatyp
b800: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  e, -1));.  Tcl_L
b810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43  _NewStringObj(zC
b840: 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20  ollseq, -1));.  
b850: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b860: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b870: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
b880: 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c  notnull));.  Tcl
b890: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b8a0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b8b0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69  cl_NewIntObj(pri
b8c0: 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c  marykey));.  Tcl
b8d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b8e0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b8f0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74  cl_NewIntObj(aut
b900: 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20  oincrement));.  
b910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b920: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
b930: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b940: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
b950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b960: 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20  INCRBLOB../*.** 
b970: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
b980: 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  d  CHANNEL OFFSE
b990: 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  T N.**.**   This
b9a0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
b9b0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
b9c0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
b9d0: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
b9e0: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
b9f0: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
ba00: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
ba10: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
ba20: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
ba30: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
ba40: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
ba50: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
ba60: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
ba70: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
ba80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
ba90: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
baa0: 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f  b_read().**   to
bab0: 20 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72   read N bytes fr
bac0: 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54  om offset OFFSET
bad0: 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
bae0: 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20  ying SQLite.**  
baf0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
bb00: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
bb10: 2c 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f  , a byte-array o
bb20: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
bb30: 20 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69   the read data i
bb40: 73 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64  s .**   returned
bb50: 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  . On failure, th
bb60: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  e interpreter re
bb70: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
bb80: 68 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70  he.**   text rep
bb90: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
bba0: 68 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  he returned erro
bbb0: 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51  r code (i.e. "SQ
bbc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20  LITE_NOMEM").** 
bbd0: 20 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65    and a Tcl exce
bbe0: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
bbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
bc00: 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  est_blob_read(. 
bc10: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
bc20: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
bc30: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
bc40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
bc50: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
bc60: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
bc70: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
bc80: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bca0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bcb0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
bcc0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
bcd0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
bce0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
bcf0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
bd00: 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  ;.  ClientData i
bd10: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73  nstanceData;.  s
bd20: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
bd30: 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65  ob;.  int notUse
bd40: 64 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  d;.  int nByte;.
bd50: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
bd60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bd70: 7a 42 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zBuf;.  int rc;.
bd80: 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
bd90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
bda0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
bdb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
bdc0: 45 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20  EL OFFSET N");. 
bdd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bde0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e  ROR;.  }..  chan
bdf0: 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  nel = Tcl_GetCha
be00: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
be10: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
be20: 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  1]), &notUsed);.
be30: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20    if( !channel. 
be40: 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c    || TCL_OK!=Tcl
be50: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
be60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
be70: 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20  &iOffset).   || 
be80: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
be90: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bea0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74  , objv[3], &nByt
beb0: 65 29 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c 30  e).   || nByte<0
bec0: 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20   || iOffset<0.  
bed0: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ){ .    return T
bee0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
bef0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20   instanceData = 
bf00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
bf10: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e  stanceData(chann
bf20: 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a  el);.  pBlob = *
bf30: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
bf40: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
bf50: 0a 0a 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69  ..  zBuf = (unsi
bf60: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
bf70: 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  Alloc(nByte);.  
bf80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
bf90: 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42  b_read(pBlob, zB
bfa0: 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73  uf, nByte, iOffs
bfb0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
bfc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bfd0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
bfe0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
bff0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75  ByteArrayObj(zBu
c000: 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65  f, nByte));.  }e
c010: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  lse{.    Tcl_Set
c020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
c030: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
c040: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
c050: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c060: 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28    }.  Tcl_Free((
c070: 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20  char *)zBuf);.. 
c080: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
c090: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
c0a0: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
c0b0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
c0c0: 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e 45  lob_write CHANNE
c0d0: 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f 4e  L OFFSET DATA ?N
c0e0: 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68  DATA?.**.**   Th
c0f0: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
c100: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 73  ed to test the s
c110: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
c120: 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  e() in ways that
c130: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
c140: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
c150: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
c160: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
c170: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
c180: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
c190: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
c1a0: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
c1b0: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
c1c0: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
c1d0: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
c1e0: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
c1f0: 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20  blob_write().** 
c200: 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 44    to write the D
c210: 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20 74  ATA byte-array t
c220: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
c230: 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e   SQLite blob han
c240: 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66  dle..**   at off
c250: 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  set OFFSET..**.*
c260: 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  *   On success, 
c270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
c280: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20  is returned. On 
c290: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74  failure, the int
c2a0: 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72 65  erpreter.**   re
c2b0: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
c2c0: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
c2d0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  tation of the re
c2e0: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64  turned error cod
c2f0: 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53  e .**   (i.e. "S
c300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e  QLITE_NOMEM") an
c310: 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  d a Tcl exceptio
c320: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a  n is thrown..*/.
c330: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
c340: 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43 6c  blob_write(.  Cl
c350: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
c360: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
c370: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
c380: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
c390: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
c3a0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
c3b0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
c3c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
c3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c3e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c3f0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
c400: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
c410: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
c420: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68  s */.){.  Tcl_Ch
c430: 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20  annel channel;. 
c440: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
c450: 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69  anceData;.  sqli
c460: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
c470: 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a  .  int notUsed;.
c480: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
c490: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69   int rc;..  unsi
c4a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b  gned char *zBuf;
c4b0: 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a  .  int nBuf;.  .
c4c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
c4d0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
c4e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c4f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c500: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
c510: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22 29  T DATA ?NDATA?")
c520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c530: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63  _ERROR;.  }..  c
c540: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
c550: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
c560: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c570: 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64  jv[1]), &notUsed
c580: 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65  );.  if( !channe
c590: 6c 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c  l || TCL_OK!=Tcl
c5a0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
c5b0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
c5c0: 26 69 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20  &iOffset) ){ .  
c5d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c5e0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61  OR;.  }..  insta
c5f0: 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65  nceData = Tcl_Ge
c600: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
c610: 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  Data(channel);. 
c620: 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69   pBlob = *((sqli
c630: 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74  te3_blob **)inst
c640: 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42  anceData);..  zB
c650: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
c660: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
c670: 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20  v[3], &nBuf);.  
c680: 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 54  if( objc==5 && T
c690: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
c6a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
c6b0: 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20  , &nBuf) ){.    
c6c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c6d0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
c6e0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
c6f0: 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75  pBlob, zBuf, nBu
c700: 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  f, iOffset);.  i
c710: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c720: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
c730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c740: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
c750: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
c760: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
c770: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
c780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43  ==SQLITE_OK ? TC
c790: 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
c7a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
c7b0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
c7c0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
c7d0: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
c7e0: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
c7f0: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
c800: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
c810: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c820: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
c830: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
c840: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
c850: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
c860: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
c870: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
c880: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
c890: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
c8a0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
c8b0: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
c8c0: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
c8d0: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
c8e0: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
c8f0: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c900: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
c910: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
c920: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
c930: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
c940: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
c950: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
c960: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
c970: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
c980: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
c990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
c9a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
c9b0: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
c9c0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
c9d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c9e0: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
c9f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
ca00: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
ca10: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
ca20: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
ca30: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
ca40: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
ca50: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
ca60: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
ca70: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
ca80: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
ca90: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
caa0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
cab0: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
cac0: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
cad0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
cae0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
caf0: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
cb00: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
cb10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
cb20: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
cb30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
cb40: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
cb50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
cb60: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
cb70: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
cb80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
cb90: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
cba0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
cbb0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
cbc0: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
cbd0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
cbe0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
cbf0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
cc00: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
cc10: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
cc20: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
cc30: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
cc40: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
cc50: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
cc60: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
cc70: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
cc80: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
cc90: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
cca0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
ccb0: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
ccc0: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
ccd0: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
cce0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
ccf0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
cd00: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
cd10: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
cd20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
cd30: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
cd40: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
cd50: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
cd60: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cd80: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
cd90: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
cda0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
cdb0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
cdc0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
cdd0: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
cde0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
cdf0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
ce00: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
ce10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ce20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
ce30: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
ce40: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
ce50: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
ce60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ce70: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
ce80: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ce90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
cea0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
ceb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
cec0: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
ced0: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
cee0: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
cef0: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
cf00: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
cf10: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
cf20: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
cf30: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
cf40: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
cf50: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
cf60: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
cf70: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
cf80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
cf90: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
cfa0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cfb0: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
cfc0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
cfd0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
cfe0: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
cff0: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
d000: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d010: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
d020: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d030: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
d040: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
d050: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
d060: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
d070: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
d080: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
d090: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d0a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
d0b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d0c0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
d0d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d0e0: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
d0f0: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
d100: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
d110: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
d120: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
d130: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
d140: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d150: 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c  /*.** USAGE: sql
d160: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
d170: 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20  tion_v2 DB NAME 
d180: 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48  NARG ENC ?SWITCH
d190: 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ES?.**.** Availa
d1a0: 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65  ble switches are
d1b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20  :.**.**   -func 
d1c0: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
d1d0: 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a  step    SCRIPT.*
d1e0: 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52  *   -final   SCR
d1f0: 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f  IPT.**   -destro
d200: 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65  y SCRIPT.*/.type
d210: 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74  def struct Creat
d220: 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61  eFunctionV2 Crea
d230: 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74  teFunctionV2;.st
d240: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
d250: 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e  ionV2 {.  Tcl_In
d260: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
d270: 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20  Tcl_Obj *pFunc; 
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75  /* Script for fu
d2a0: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
d2b0: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
d2c0: 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  pStep;          
d2d0: 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74         /* Script
d2e0: 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69   for agg. step i
d2f0: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
d300: 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20  cl_Obj *pFinal; 
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d320: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67  * Script for agg
d330: 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69  . finalization i
d340: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
d350: 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79  cl_Obj *pDestroy
d360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d370: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72  * Destructor scr
d380: 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  ipt */.};.static
d390: 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71   void cf2Func(sq
d3a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
d3b0: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
d3c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
d3d0: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
d3e0: 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74  id cf2Step(sqlit
d3f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
d400: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
d410: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
d420: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
d430: 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  cf2Final(sqlite3
d440: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
d450: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66  }.static void cf
d460: 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  2Destroy(void *p
d470: 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46  User){.  CreateF
d480: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28  unctionV2 *p = (
d490: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d4a0: 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28   *)pUser;..  if(
d4b0: 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d   p->interp && p-
d4c0: 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >pDestroy ){.   
d4d0: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
d4e0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
d4f0: 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20  p, p->pDestroy, 
d500: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
d510: 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63  TCL_OK ) Tcl_Bac
d520: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
d530: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
d540: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
d550: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
d560: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
d570: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
d580: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
d590: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d5a0: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
d5b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
d5c0: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
d5d0: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
d5e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d5f0: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20  ->pDestroy); .  
d600: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
d610: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
d620: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
d630: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
d640: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
d650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
d660: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
d670: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
d680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d690: 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e   invoking TCL in
d6a0: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
d6b0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
d6e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
d6f0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
d700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d710: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
d720: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d730: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
d740: 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20  r *zFunc;.  int 
d750: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b  nArg;.  int enc;
d760: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
d770: 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  nV2 *p;.  int i;
d780: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74  .  int rc;..  st
d790: 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a  ruct EncTable {.
d7a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d7b0: 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e  zEnc;.    int en
d7c0: 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20  c;.  } aEnc[] = 
d7d0: 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20  {.    {"utf8",  
d7e0: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c    SQLITE_UTF8 },
d7f0: 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20  .    {"utf16",  
d800: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c   SQLITE_UTF16 },
d810: 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c  .    {"utf16le",
d820: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
d830: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65  },.    {"utf16be
d840: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
d850: 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c  E },.    {"any",
d860: 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20       SQLITE_ANY 
d870: 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d  },.    {"0", 0 }
d880: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
d890: 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d  c<5 || (objc%2)=
d8a0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =0 ){.    Tcl_Wr
d8b0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d8c0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
d8d0: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57  NAME NARG ENC SW
d8e0: 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20  ITCHES...");.   
d8f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d900: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
d910: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
d920: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
d930: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
d940: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d950: 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63  OR;.  zFunc = Tc
d960: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d970: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
d980: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
d990: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
d9a0: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
d9b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
d9c0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
d9d0: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
d9e0: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c  , objv[4], aEnc,
d9f0: 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29   sizeof(aEnc[0])
da00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e  , .          "en
da10: 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63  coding", 0, &enc
da20: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
da30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
da40: 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e  .  enc = aEnc[en
da50: 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73  c].enc;..  p = s
da60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
da70: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
da80: 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72  ionV2));.  asser
da90: 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74  t( p );.  memset
daa0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72  (p, 0, sizeof(Cr
dab0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29  eateFunctionV2))
dac0: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
dad0: 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69  interp;..  for(i
dae0: 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32  =5; i<objc; i+=2
daf0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74  ){.    int iSwit
db00: 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ch;.    const ch
db10: 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d  ar *azSwitch[] =
db20: 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65   {"-func", "-ste
db30: 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d  p", "-final", "-
db40: 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20  destroy", 0};.  
db50: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
db60: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
db70: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69  , objv[i], azSwi
db80: 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30  tch, "switch", 0
db90: 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20  , &iSwitch) ){. 
dba0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
dbb0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
dbc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dbd0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
dbe0: 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   iSwitch ){.    
dbf0: 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75    case 0: p->pFu
dc00: 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  nc = objv[i+1]; 
dc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc20: 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74    case 1: p->pSt
dc30: 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  ep = objv[i+1]; 
dc40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc50: 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69    case 2: p->pFi
dc60: 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b  nal = objv[i+1];
dc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc80: 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65    case 3: p->pDe
dc90: 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31  stroy = objv[i+1
dca0: 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ];   break;.    
dcb0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
dcc0: 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20  Func ) p->pFunc 
dcd0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
dce0: 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  bj(p->pFunc); . 
dcf0: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
dd00: 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44  p->pStep = Tcl_D
dd10: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
dd20: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
dd30: 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69  >pFinal ) p->pFi
dd40: 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  nal = Tcl_Duplic
dd50: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c  ateObj(p->pFinal
dd60: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
dd70: 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74  stroy ) p->pDest
dd80: 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  roy = Tcl_Duplic
dd90: 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72  ateObj(p->pDestr
dda0: 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e  oy); ..  if( p->
ddb0: 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72  pFunc ) Tcl_Incr
ddc0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
ddd0: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
dde0: 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  tep ) Tcl_IncrRe
ddf0: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
de00: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
de10: 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  al ) Tcl_IncrRef
de20: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
de30: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
de40: 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52  troy ) Tcl_IncrR
de50: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
de60: 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73  roy); ..  rc = s
de70: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
de80: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
de90: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
dea0: 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20  (void *)p, .    
deb0: 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66    (p->pFunc ? cf
dec0: 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20  2Func : 0),.    
ded0: 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66    (p->pStep ? cf
dee0: 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20  2Step : 0),.    
def0: 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63    (p->pFinal ? c
df00: 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20  f2Final : 0),.  
df10: 20 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20      cf2Destroy. 
df20: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
df30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
df40: 2d 3e 69 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20  ->interp = 0;.  
df50: 20 20 63 66 32 44 65 73 74 72 6f 79 28 70 29 3b    cf2Destroy(p);
df60: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
df70: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
df80: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
df90: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
dfa0: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
dfb0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
dfc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dfd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
dfe0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
dff0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  ge: sqlite3_load
e000: 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41  _extension DB-HA
e010: 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f  NDLE FILE ?PROC?
e020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e030: 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  est_load_extensi
e040: 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  on(.  ClientData
e050: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
e060: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
e070: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
e080: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
e090: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
e0a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
e0b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
e0c0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
e0d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
e0e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
e0f0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e100: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
e110: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
e120: 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
e130: 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  dInfo;.  sqlite3
e140: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e150: 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63    char *zDb;.  c
e160: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
e170: 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20  ar *zProc = 0;. 
e180: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
e190: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
e1a0: 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
e1b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e1c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
e1d0: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46  jv, "DB-HANDLE F
e1e0: 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20  ILE ?PROC?");.  
e1f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e200: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
e210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e220: 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20  jv[1]);.  zFile 
e230: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
e240: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
e250: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a  objc==4 ){.    z
e260: 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74  Proc = Tcl_GetSt
e270: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
e280: 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74   }..  /* Extract
e290: 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20   the C database 
e2a0: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
e2b0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
e2c0: 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47   */.  if( !Tcl_G
e2d0: 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
e2e0: 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49  terp, zDb, &cmdI
e2f0: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
e300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e310: 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f  erp, "command no
e320: 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c  t found: ", zDb,
e330: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
e340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e350: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73  ;.  }.  db = ((s
e360: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
e370: 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
e380: 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73  tData)->db;.  as
e390: 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  sert(db);..  /* 
e3a0: 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79  Call the underly
e3b0: 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20  ing C function. 
e3c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
e3d0: 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20  rs, set rc to . 
e3e0: 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e   ** TCL_ERROR an
e3f0: 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72  d load any error
e400: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65   string into the
e410: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66   interpreter. If
e420: 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20   no .  ** error 
e430: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
e440: 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23  o TCL_OK..  */.#
e450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e460: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
e470: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  .  rc = SQLITE_E
e480: 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73  RROR;.  zErr = s
e490: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
e4a0: 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73  this build omits
e4b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
e4c0: 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c  tension()");.#el
e4d0: 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  se.  rc = sqlite
e4e0: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
e4f0: 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f  (db, zFile, zPro
e500: 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69  c, &zErr);.#endi
e510: 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
e520: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
e530: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
e540: 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a  p, zErr ? zErr :
e550: 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c   "", TCL_VOLATIL
e560: 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  E);.    rc = TCL
e570: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
e580: 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  .    rc = TCL_OK
e590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
e5a0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72  free(zErr);..  r
e5b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e5c0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
e5d0: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
e5e0: 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c  tension DB-HANDL
e5f0: 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69  E ONOFF.*/.stati
e600: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
e610: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
e620: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
e630: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
e640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
e660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
e670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
e680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
e690: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
e6a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e6b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
e6c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e6d0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
e6e0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
e6f0: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
e700: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
e710: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
e720: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
e730: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
e740: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
e750: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e760: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
e770: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
e780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e790: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
e7a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
e7b0: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
e7c0: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
e7d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
e7e0: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
e7f0: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
e800: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
e810: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
e820: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
e830: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e840: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
e850: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
e860: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
e870: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e880: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
e890: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
e8a0: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
e8b0: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
e8c0: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
e8d0: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
e8e0: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
e8f0: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
e900: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
e910: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
e920: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
e930: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e940: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
e950: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
e960: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
e970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e980: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
e990: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
e9a0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
e9b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9c0: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
e9d0: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
e9e0: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
e9f0: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
ea00: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
ea10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
ea20: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
ea30: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
ea40: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
ea50: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
ea60: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
ea70: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
ea80: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
ea90: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
eaa0: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
eab0: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
eac0: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
ead0: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
eae0: 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f  c int sqlite_abo
eaf0: 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  rt(.  void *NotU
eb00: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
eb10: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
eb20: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
eb30: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
eb40: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
eb50: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
eb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
eb70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
eb80: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
eb90: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
eba0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
ebb0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
ebc0: 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45   defined(_MSC_VE
ebd0: 52 29 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68  R).  /* We do th
ebe0: 69 73 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68  is, otherwise th
ebf0: 65 20 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74  e test will halt
ec00: 20 77 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65   with a popup me
ec10: 73 73 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20  ssage.   * that 
ec20: 77 65 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b  we have to click
ec30: 20 61 77 61 79 20 62 65 66 6f 72 65 20 74 68 65   away before the
ec40: 20 74 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69   test will conti
ec50: 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65  nue..   */.  _se
ec60: 74 5f 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72  t_abort_behavior
ec70: 28 20 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52  ( 0, _CALL_REPOR
ec80: 54 46 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66  TFAULT );.#endif
ec90: 0a 20 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20  .  exit(255);.  
eca0: 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d  assert( interp==
ecb0: 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77  0 );   /* This w
ecc0: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
ecd0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
ece0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
ecf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
ed00: 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66  ne is a user-def
ed10: 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
ed20: 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a  n whose purpose.
ed30: 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ** is to test th
ed40: 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73  e sqlite_set_res
ed50: 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  ult() API..*/.st
ed60: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75  atic void testFu
ed70: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
ed80: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
ed90: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
eda0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
edb0: 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29  while( argc>=2 )
edc0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
edd0: 20 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a   *zArg0 = (char*
ede0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
edf0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
ee00: 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20    if( zArg0 ){. 
ee10: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
ee20: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
ee30: 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20  , "int") ){.    
ee40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ee50: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
ee60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
ee70: 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  t(argv[1]));.   
ee80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
ee90: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
eea0: 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b  0,"int64")==0 ){
eeb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eec0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
eed0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
eee0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
eef0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
ef00: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
ef10: 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69  ICmp(zArg0,"stri
ef20: 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ng")==0 ){.     
ef30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ef40: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
ef50: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
ef60: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
ef70: 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ]), -1,.        
ef80: 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53      SQLITE_TRANS
ef90: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c  IENT);.      }el
efa0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
efb0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75  rICmp(zArg0,"dou
efc0: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
efd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
efe0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
eff0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
f000: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29  _double(argv[1])
f010: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
f020: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
f030: 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d  p(zArg0,"null")=
f040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
f050: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
f060: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
f070: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f080: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
f090: 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a  ,"value")==0 ){.
f0a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f0b0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
f0c0: 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74  text, argv[sqlit
f0d0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
f0e0: 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d  v[1])]);.      }
f0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f  else{.        go
f100: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
f110: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f120: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
f130: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
f140: 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20   argc -= 2;.    
f150: 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  argv += 2;.  }. 
f160: 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f   return;..error_
f170: 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72  out:.  sqlite3_r
f180: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
f190: 65 78 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d  ext,"first argum
f1a0: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ent should be on
f1b0: 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69  e of: ".      "i
f1c0: 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20  nt int64 string 
f1d0: 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75  double null valu
f1e0: 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e", -1);.}../*.*
f1f0: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
f200: 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f  e_register_test_
f210: 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41  function  DB  NA
f220: 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  ME.**.** Registe
f230: 72 20 74 68 65 20 74 65 73 74 20 53 51 4c 20 66  r the test SQL f
f240: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  unction on the d
f250: 61 74 61 62 61 73 65 20 44 42 20 75 6e 64 65 72  atabase DB under
f260: 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a   the name NAME..
f270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f280: 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63  st_register_func
f290: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
f2a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
f2b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
f2c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
f2d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
f2e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
f2f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
f300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f310: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
f320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
f330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f340: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
f350: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
f360: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
f370: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
f380: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
f390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f3a0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
f3b0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
f3c0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
f3d0: 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e   " DB FUNCTION-N
f3e0: 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  AME", 0);.    re
f3f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f400: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
f410: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
f420: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
f430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f440: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f450: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
f460: 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c  db, argv[2], -1,
f470: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
f480: 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e 63   .      testFunc
f490: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
f4a0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=0 ){.    Tcl_
f4b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f4c0: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
f4d0: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
f4e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
f500: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
f510: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
f520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f530: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
f540: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
f550: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ge:  sqlite3_fin
f560: 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a  alize  STMT .**.
f570: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74  ** Finalize a st
f580: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
f590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f5a0: 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76  st_finalize(.  v
f5b0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
f5c0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
f5d0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f5e0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f5f0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f600: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f610: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
f620: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f630: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
f640: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
f650: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f660: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
f670: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
f680: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
f690: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f6a0: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
f6b0: 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
f6c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f6d0: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
f6e0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f6f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f700: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f720: 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d  ROR;..  if( pStm
f730: 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74  t ){.    db = St
f740: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20  mtToDb(pStmt);. 
f750: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f760: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
f770: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
f780: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
f790: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
f7a0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
f7b0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c  .  if( db && sql
f7c0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
f7d0: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
f7e0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f7f0: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
f800: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f810: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
f820: 6d 74 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20  mt_status  STMT 
f830: 20 43 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47   CODE  RESETFLAG
f840: 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76  .**.** Get the v
f850: 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75 73  alue of a status
f860: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20   counter from a 
f870: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
f880: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
f890: 6d 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69  mt_status(.  voi
f8a0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f8b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f8c0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f8d0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f8e0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
f8f0: 6e 74 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74  nt iValue;.  int
f900: 20 69 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61   i, op, resetFla
f910: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
f920: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  *zOpName;.  sqli
f930: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
f940: 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ..  static const
f950: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
f960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
f970: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d  .    int op;.  }
f980: 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b   aOp[] = {.    {
f990: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
f9a0: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
f9b0: 50 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d  P",   SQLITE_STM
f9c0: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
f9d0: 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b  _STEP   },.    {
f9e0: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
f9f0: 54 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20  TUS_SORT",      
fa00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d        SQLITE_STM
fa10: 54 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20  TSTATUS_SORT    
fa20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
fa30: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
fa40: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20  TUS_AUTOINDEX", 
fa50: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d        SQLITE_STM
fa60: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
fa70: 58 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a  X       },.  };.
fa80: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
fa90: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
faa0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
fab0: 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52   objv, "STMT PAR
fac0: 41 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41 47  AMETER RESETFLAG
fad0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
fae0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
faf0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
fb00: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
fb10: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
fb20: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
fb30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fb40: 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zOpName = Tcl_G
fb50: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fb60: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
fb70: 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20  ArraySize(aOp); 
fb80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
fb90: 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d  rcmp(aOp[i].zNam
fba0: 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29  e, zOpName)==0 )
fbb0: 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70  {.      op = aOp
fbc0: 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72  [i].op;.      br
fbd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
fbe0: 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
fbf0: 65 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66  e(aOp) ){.    if
fc00: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
fc10: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
fc20: 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75  [2], &op) ) retu
fc30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fc40: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  }.  if( Tcl_GetB
fc50: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
fc60: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
fc70: 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65 74  resetFlag) ) ret
fc80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fc90: 20 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65   iValue = sqlite
fca0: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
fcb0: 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c  tmt, op, resetFl
fcc0: 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ag);.  Tcl_SetOb
fcd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
fce0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56  Tcl_NewIntObj(iV
fcf0: 61 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  alue));.  return
fd00: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
fd10: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
fd20: 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20  3_next_stmt  DB 
fd30: 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
fd40: 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  rn the next stat
fd50: 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65  ment in sequence
fd60: 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a   after STMT..*/.
fd70: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
fd80: 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69  next_stmt(.  voi
fd90: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fda0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fdb0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fdc0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fdd0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
fde0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fdf0: 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  mt;.  sqlite3 *d
fe00: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  b = 0;.  char zB
fe10: 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  uf[50];..  if( o
fe20: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
fe30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fe40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
fe50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
fe60: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
fe70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
fe80: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
fe90: 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20   DB STMT", 0);. 
fea0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
feb0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
fec0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
fed0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
fee0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
fef0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ff00: 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53  RROR;.  if( getS
ff10: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ff20: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ff30: 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d  (objv[2]), &pStm
ff40: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ff50: 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d  ERROR;.  pStmt =
ff60: 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
ff70: 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20  mt(db, pStmt);. 
ff80: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
ff90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
ffa0: 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
ffb0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
ffc0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
ffd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
ffe0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fff0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
10000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
10010 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
10020 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
10030 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  eset  STMT .**.*
10040 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d  * Reset a statem
10050 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
10060 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
10070 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
10080 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10090 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
100a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
100b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
100c0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
100d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
100e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
100f0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10100 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10110 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10120 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10130 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10140 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10150 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10160 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
10170 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10180 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10190 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
101a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
101b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
101c0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
101d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
101e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
101f0 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
10200 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54  Stmt && sqlite3T
10210 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
10220 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
10230 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72  t), rc) ){.    r
10240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10250 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
10260 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
10270 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
10280 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
10290 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29  );./*.  if( rc )
102a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
102b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20  _ERROR;.  }.*/. 
102c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
102d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
102e0 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
102f0 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
10300 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72 65  urn TRUE if a re
10310 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
10320 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
10330 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a  recommended..*/.
10340 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10350 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
10360 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10370 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10380 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10390 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
103a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
103b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
103c0 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
103d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
103e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
103f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10410 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10420 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10430 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10440 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10450 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
10460 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10470 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10480 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10490 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
104a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
104b0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
104c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
104d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
104e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
104f0 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71  NewBooleanObj(sq
10500 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53  lite3_expired(pS
10510 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tmt)));.#endif. 
10520 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10530 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
10540 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
10550 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
10560 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
10570 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
10580 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
10590 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
105a0 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
105b0 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f  t test_transfer_
105c0 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  bind(.  void * c
105d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
105e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
105f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10600 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10610 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
10620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10630 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33  ECATED.  sqlite3
10640 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a  _stmt *pStmt1, *
10650 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62  pStmt2;.  if( ob
10660 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
10670 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10680 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
10690 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
106a0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
106b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
106c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
106d0 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d  FROM-STMT TO-STM
106e0 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
106f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10700 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
10710 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10720 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10730 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29  v[1]), &pStmt1))
10740 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10750 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
10760 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10770 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10780 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29  jv[2]), &pStmt2)
10790 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
107a0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
107b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
107c0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
107d0 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  bj(sqlite3_trans
107e0 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  fer_bindings(pSt
107f0 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23  mt1,pStmt2)));.#
10800 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
10810 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10820 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10830 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a  changes DB.**.**
10840 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10850 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61  er of changes ma
10860 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
10870 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20 53  se by the last S
10880 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  QL.** execution.
10890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
108a0 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
108b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
108c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
108d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
108e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
108f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10900 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
10910 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10920 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10930 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
10940 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
10950 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
10960 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
10970 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
10980 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10990 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
109a0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
109b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
109c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
109d0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
109e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
109f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10a00 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
10a10 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
10a20 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
10a30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
10a40 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
10a50 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
10a60 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
10a70 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
10a80 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
10a90 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
10aa0 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
10ab0 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
10ac0 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
10ad0 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
10ae0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
10af0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
10b00 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
10b10 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10b20 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
10b30 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
10b40 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
10b50 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
10b60 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f   occurance of "?
10b70 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
10b80 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
10b90 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
10ba0 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
10bb0 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
10bc0 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
10bd0 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
10be0 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
10bf0 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
10c00 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
10c10 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
10c20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
10c30 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
10c40 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
10c50 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
10c60 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
10c70 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
10c80 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
10c90 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 20   VALUE is made. 
10ca0 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62   If FLAGS=="blob
10cb0 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55 45  10" then a VALUE
10cc0 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   is ignored.** a
10cd0 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f 62  n a 10-byte blob
10ce0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
10cf0 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64 2e  pq" is inserted.
10d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
10d10 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  est_bind(.  void
10d20 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
10d30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10d40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
10d50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
10d60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
10d70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
10d80 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
10d90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
10da0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
10db0 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
10dc0 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
10dd0 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
10de0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
10df0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
10e00 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
10e10 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
10e20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10e30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10e40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10e50 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
10e60 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d  0], .       " VM
10e70 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c   IDX VALUE (null
10e80 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c  |static|normal)\
10e90 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
10ea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10eb0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
10ec0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
10ed0 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20  rgv[1], &pStmt) 
10ee0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10ef0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
10f00 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
10f10 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
10f20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10f30 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
10f40 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  v[4],"null")==0 
10f50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10f60 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
10f70 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c  tmt, idx);.  }el
10f80 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
10f90 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d  gv[4],"static")=
10fa0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
10fb0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
10fc0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
10fd0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
10fe0 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20  value, -1, 0);. 
10ff0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11000 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
11010 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  c-nbytes")==0 ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
11040 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
11050 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
11060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
11090 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
110a0 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e, 0);.  }else i
110b0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
110c0 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29  ],"normal")==0 )
110d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
110e0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
110f0 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d  mt, idx, argv[3]
11100 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
11110 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
11120 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
11130 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30  [4],"blob10")==0
11140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11150 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
11160 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c  Stmt, idx, "abc\
11170 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31  000xyz\000pq", 1
11180 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  0, SQLITE_STATIC
11190 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
111a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
111b0 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72  (interp, "4th ar
111c0 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
111d0 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75   ".        "\"nu
111e0 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63  ll\" or \"static
111f0 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22  \" or \"normal\"
11200 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
11210 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11220 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
11230 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
11240 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
11250 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
11260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
11270 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20   rc ){.    char 
11280 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70  zBuf[50];.    sp
11290 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
112a0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
112b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
112c0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
112d0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
112e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
112f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11300 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11310 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11320 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
11330 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
11340 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74  t_collate <db pt
11350 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
11360 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
11370 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11380 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
11390 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
113a0 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
113b0 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73  t collation.** s
113c0 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b  equence callback
113d0 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76   when multiple v
113e0 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66  ersions (for dif
113f0 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f  ferent text enco
11400 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76  dings).** are av
11410 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43  ailable..**.** C
11420 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11430 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68  ine registers th
11440 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
11450 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61  ence "test_colla
11460 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61  te".** with data
11470 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
11480 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
11490 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
114a0 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a  list of three.**
114b0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e   boolean values.
114c0 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73   If the first is
114d0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65   true, then a ve
114e0 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f  rsion of test_co
114f0 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69  llate is.** regi
11500 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38  stered for UTF-8
11510 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
11520 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69  is true, a versi
11530 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
11540 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65   for.** UTF-16le
11550 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69  , if the third i
11560 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  s true, a UTF-16
11570 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
11580 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76  ailable..** Prev
11590 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
115a0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72   test_collate ar
115b0 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
115c0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
115d0 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c  equence test_col
115e0 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e  late is implemen
115f0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
11600 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
11610 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a  TCL script:.**.*
11620 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  *   "test_collat
11630 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72  e <enc> <lhs> <r
11640 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c  hs>".**.** The <
11650 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61  lhs> and <rhs> a
11660 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
11670 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64  s being compared
11680 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  , encoded in UTF
11690 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e  -8..** The <enc>
116a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
116b0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
116c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
116d0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c  tion that.** SQL
116e0 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20  ite selected to 
116f0 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65  call. The TCL te
11700 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d  st script implem
11710 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73  ents the.** "tes
11720 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e  t_collate" proc.
11730 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
11740 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20   this will only 
11750 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e  work with one in
11760 74 65 70 72 65 74 65 72 20 61 74 20 61 20 74 69  tepreter at a ti
11770 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e  me, as the.** in
11780 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20  terp pointer to 
11790 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74  use when evaluat
117a0 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69  ing the TCL scri
117b0 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  pt is stored in.
117c0 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  ** pTestCollateI
117d0 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
117e0 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65   Tcl_Interp* pTe
117f0 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
11800 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11810 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
11820 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
11830 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
11840 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
11850 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
11860 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
11870 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61   *i = pTestColla
11880 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20  teInterp;.  int 
11890 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50  encin = SQLITE_P
118a0 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b  TR_TO_INT(pCtx);
118b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
118c0 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  t n;..  sqlite3_
118d0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54  value *pVal;.  T
118e0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70  cl_Obj *pX;..  p
118f0 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
11900 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61  gObj("test_colla
11910 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  te", -1);.  Tcl_
11920 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
11930 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63  ;..  switch( enc
11940 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  in ){.    case S
11950 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
11960 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11970 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
11980 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11990 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20  ("UTF-8",-1));. 
119a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
119b0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
119c0 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6LE:.      Tcl_L
119d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
119e0 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
119f0 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
11a00 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6LE",-1));.     
11a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11a20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a   SQLITE_UTF16BE:
11a30 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
11a40 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11a50 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
11a60 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22  ngObj("UTF-16BE"
11a70 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
11a80 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
11a90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
11aa0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
11ab0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11ac0 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  c();.  pVal = sq
11ad0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
11ae0 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
11af0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11b00 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c  SetStr(pVal, nA,
11b10 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zA, encin, SQLI
11b20 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11b30 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
11b40 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
11b50 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11b60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
11b70 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
11b80 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11b90 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11ba0 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
11bb0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11bc0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c  SetStr(pVal, nB,
11bd0 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zB, encin, SQLI
11be0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11bf0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
11c00 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
11c10 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11c20 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
11c30 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65  ,.        Tcl_Ne
11c40 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11c50 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11c60 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a  text(pVal),n));.
11c70 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11c80 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Free(pVal);.  }.
11c90 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
11ca0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54  gnMalloc();..  T
11cb0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20  cl_EvalObjEx(i, 
11cc0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
11cd0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
11ce0 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
11cf0 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62  Obj(i, Tcl_GetOb
11d00 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73  jResult(i), &res
11d10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
11d20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
11d30 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  st_collate(.  vo
11d40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11d50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11d60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11d70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11d80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11d90 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
11da0 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65  nt val;.  sqlite
11db0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
11dc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
11dd0 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
11de0 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73 74  ad_args;.  pTest
11df0 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d 20  CollateInterp = 
11e00 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67 65  interp;.  if( ge
11e10 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
11e20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11e30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
11e40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11e50 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
11e60 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
11e70 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
11e80 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
11e90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11ea0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
11eb0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
11ec0 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
11ed0 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
11ee0 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TF8, .          
11ef0 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
11f00 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  TF8, val?test_co
11f10 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
11f20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11f30 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
11f40 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20  void *zUtf16;.  
11f50 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
11f60 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
11f70 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11f80 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
11f90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11fb0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
11fc0 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
11fd0 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  te", SQLITE_UTF1
11fe0 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6LE, .          
11ff0 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
12000 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65  _UTF16LE, val?te
12010 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
12020 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  0);.    if( TCL_
12030 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12040 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12050 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
12060 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12070 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20  ROR;..#if 0.    
12080 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  if( sqlite3_iMal
12090 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20  locFail>0 ){.   
120a0 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
120b0 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  ocFail++;.    }.
120c0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
120d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
120e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  b->mutex);.    p
120f0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
12100 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
12110 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12120 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73  r(pVal, -1, "tes
12130 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
12140 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
12150 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74  STATIC);.    zUt
12160 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  f16 = sqlite3Val
12170 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
12180 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
12190 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
121a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
121b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
121c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
121d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
121e0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
121f0 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66  ation16(db, zUtf
12200 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  16, SQLITE_UTF16
12210 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  BE, .          (
12220 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
12230 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16BE, val?test_
12240 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
12250 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12260 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
12270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
12280 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
12290 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  utex);.  }.  if(
122a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
122b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
122c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
122d0 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28  _ERROR;.  .  if(
122e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
122f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12300 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
12310 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
12320 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
12330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12340 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12350 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
12360 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
12370 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12380 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12390 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
123a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
123b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
123c0 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
123d0 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
123e0 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
123f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12400 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
12410 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
12420 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
12430 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
12440 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
12450 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
12460 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
12470 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
12480 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
12490 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
124a0 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
124b0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
124c0 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
124d0 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
124e0 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
124f0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
12500 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
12510 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
12520 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
12530 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
12540 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
12550 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
12560 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12570 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
12580 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
12590 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
125a0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
125b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
125c0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
125d0 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
125e0 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
125f0 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
12600 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
12610 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
12620 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
12630 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
12640 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
12650 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
12660 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
12670 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
12680 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12690 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
126a0 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
126b0 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
126c0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
126d0 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
126e0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
126f0 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45   ENC(db), SQLITE
12700 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29  _INT_TO_PTR(enc)
12710 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
12720 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
12730 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
12740 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
12750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12760 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
12770 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
12780 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
12790 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
127a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
127b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
127c0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
127d0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
127e0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
127f0 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12800 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
12810 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
12820 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12830 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
12840 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
12850 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
12860 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
12870 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
12880 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
12890 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
128a0 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
128b0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
128c0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
128d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
128e0 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
128f0 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
12900 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
12910 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
12920 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
12930 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12940 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
12950 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
12960 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
12970 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
12980 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
12990 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
129a0 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
129b0 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
129c0 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
129d0 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
129e0 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
129f0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
12a00 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
12a10 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
12a20 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
12a30 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
12a40 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
12a50 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
12a60 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
12a70 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
12a80 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
12a90 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
12aa0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
12ab0 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
12ac0 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
12ad0 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
12ae0 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
12af0 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
12b00 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
12b10 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
12b20 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
12b30 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
12b40 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
12b50 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
12b60 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
12b70 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
12b80 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
12b90 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
12ba0 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
12bb0 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
12bc0 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
12bd0 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
12be0 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
12bf0 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
12c00 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
12c10 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
12c20 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
12c30 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
12c40 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
12c50 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
12c60 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
12c70 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
12c80 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
12c90 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
12ca0 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
12cb0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
12cc0 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
12cd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12ce0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
12cf0 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
12d00 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
12d10 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12d20 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12d30 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12d40 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12d50 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12d60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12d70 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
12d80 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
12d90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12da0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12db0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
12dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12dd0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12de0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
12df0 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
12e00 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
12e10 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
12e20 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
12e30 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12e40 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
12e50 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
12e60 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
12e70 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
12e80 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
12e90 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
12ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12eb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
12ec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12ed0 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
12ee0 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
12ef0 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
12f00 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
12f10 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
12f20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12f30 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
12f40 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
12f50 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
12f60 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
12f70 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
12f80 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
12f90 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
12fa0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
12fb0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
12fc0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
12fd0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
12fe0 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
12ff0 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
13000 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
13010 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
13020 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
13030 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
13040 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
13050 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
13060 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
13070 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
13080 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
13090 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
130a0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
130b0 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
130c0 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
130d0 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
130e0 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
130f0 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
13100 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
13110 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
13120 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
13130 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
13140 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
13150 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
13160 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
13170 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
13180 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
13190 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
131a0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
131b0 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
131c0 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
131d0 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
131e0 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
131f0 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
13200 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
13210 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
13220 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
13230 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
13240 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
13250 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
13260 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
13270 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
13280 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
13290 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
132a0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
132b0 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
132c0 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
132d0 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
132e0 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
132f0 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
13300 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
13310 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13320 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
13330 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
13340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13350 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
13360 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
13370 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
13380 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
13390 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
133a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
133b0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
133c0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
133d0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
133e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
133f0 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
13400 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
13410 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13420 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
13430 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
13440 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
13450 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
13460 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
13470 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13480 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13490 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
134a0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
134b0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
134c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
134d0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
134e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
134f0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
13500 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13510 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
13520 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
13530 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
13540 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
13550 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
13560 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
13570 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13580 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
13590 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
135a0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
135b0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
135c0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
135d0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
135e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
135f0 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
13600 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
13610 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
13620 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13630 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
13640 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13650 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
13660 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
13670 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
13680 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
13690 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
136a0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
136b0 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
136c0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
136d0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
136e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
136f0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
13700 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
13710 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
13720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
13730 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
13740 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
13750 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
13760 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
13770 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13780 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
13790 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
137a0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
137b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
137c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
137d0 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
137e0 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
137f0 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
13800 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13810 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
13820 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
13830 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
13840 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13850 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
13860 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
13870 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
13880 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
13890 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
138a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
138b0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
138c0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
138d0 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
138e0 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
138f0 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
13900 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
13910 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
13920 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
13930 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
13940 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
13950 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
13960 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
13970 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
13980 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
13990 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
139a0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
139b0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
139c0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
139d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
139e0 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
139f0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
13a00 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
13a10 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
13a20 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
13a30 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
13a40 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
13a50 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
13a60 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
13a70 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
13a80 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
13a90 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
13aa0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13ab0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
13ac0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13ad0 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
13ae0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
13af0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
13b00 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
13b10 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
13b20 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
13b30 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13b40 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
13b50 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
13b60 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
13b70 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
13b80 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
13b90 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
13ba0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
13bb0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
13bc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
13bd0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
13be0 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
13bf0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
13c00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
13c10 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
13c20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13c30 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
13c40 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
13c50 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
13c60 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
13c70 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
13c80 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
13c90 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
13ca0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
13cb0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
13cc0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
13cd0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
13ce0 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
13cf0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
13d00 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
13d10 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
13d20 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
13d30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
13d40 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
13d50 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
13d60 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
13d70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13d80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13d90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
13da0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
13db0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
13dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13dd0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
13de0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
13df0 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
13e00 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
13e10 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
13e20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
13e30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
13e40 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
13e50 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
13e60 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
13e70 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
13e80 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
13e90 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
13ea0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
13eb0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
13ec0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13ed0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
13ee0 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
13ef0 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
13f00 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
13f10 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
13f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
13f30 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
13f40 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
13f50 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
13f60 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13f70 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
13f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
13f90 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
13fa0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
13fb0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
13fc0 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
13fd0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
13fe0 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
13ff0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
14000 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14010 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14020 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
14030 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14040 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14050 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14060 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14070 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14080 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14090 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
140a0 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
140b0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
140c0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
140d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
140e0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
140f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14100 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
14110 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
14120 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
14130 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14140 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
14150 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
14160 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
14170 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14180 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
14190 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
141a0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
141b0 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ge:         sqli
141c0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20  te3_test_errstr 
141d0 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
141e0 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
141f0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
14200 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
14210 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
14220 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
14230 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
14240 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
14250 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
14260 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
14270 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
14280 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
14290 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
142a0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
142b0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
142c0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
142d0 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
142e0 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
142f0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
14300 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
14310 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14320 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14330 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14340 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14350 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14360 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
14370 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
14380 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
14390 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
143a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
143b0 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
143c0 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
143d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
143e0 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
143f0 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
14400 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
14410 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
14420 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
14430 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
14440 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
14450 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
14460 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
14470 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14480 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
14490 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
144a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
144b0 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
144c0 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
144d0 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
144e0 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
144f0 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
14500 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
14510 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
14520 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
14530 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
14540 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
14550 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
14560 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
14570 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
14580 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
14590 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
145a0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
145b0 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
145c0 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
145d0 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
145e0 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
145f0 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
14600 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
14610 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
14620 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
14630 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
14640 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
14650 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
14660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14670 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
14680 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
14690 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
146a0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
146b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
146c0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
146d0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
146e0 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
146f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14700 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
14710 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
14720 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
14730 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
14740 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
14750 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
14760 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
14770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
14780 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
14790 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
147a0 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
147b0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
147c0 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
147d0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
147e0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
147f0 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
14800 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
14810 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
14820 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
14830 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
14840 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
14850 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
14860 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
14870 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14880 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
14890 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
148a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
148b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
148c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
148d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
148e0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
148f0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
14900 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
14910 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14920 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
14930 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14940 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
14950 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
14960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
14970 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
14980 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
14990 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
149a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
149b0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
149c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
149d0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
149e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
149f0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
14a00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14a10 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
14a20 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14a30 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
14a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14a50 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
14a60 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
14a70 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
14a80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
14a90 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
14aa0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
14ab0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
14ac0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
14af0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
14b00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
14b10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
14b20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14b30 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
14b40 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
14b50 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
14b60 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
14b70 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
14b80 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
14b90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
14ba0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
14bb0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
14bc0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
14bd0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
14be0 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
14bf0 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
14c00 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
14c10 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
14c20 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
14c30 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
14c40 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
14c50 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
14c60 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
14c70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
14c80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
14c90 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
14ca0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14cb0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
14cc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14cd0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
14ce0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
14cf0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
14d00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
14d10 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
14d20 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
14d30 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
14d40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14d50 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
14d60 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
14d70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14d80 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
14d90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14da0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
14db0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
14dc0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
14dd0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
14de0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
14df0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14e00 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
14e10 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
14e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
14e30 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
14e40 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
14e50 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
14e60 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
14e70 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
14e80 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
14e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14ea0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
14eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14ec0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14ed0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
14ee0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
14ef0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
14f00 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
14f10 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
14f20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
14f30 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
14f40 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
14f50 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
14f60 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
14f70 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
14f80 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
14f90 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
14fa0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
14fb0 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
14fc0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
14fd0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
14fe0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
14ff0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
15000 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15010 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15020 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15030 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15040 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15050 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
15060 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15070 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b  dx;.  i64 value;
15080 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15090 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
150a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
150b0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
150c0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
150d0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
150e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
150f0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
15100 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
15110 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
15120 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15130 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
15140 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
15150 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15160 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
15170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15180 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
15190 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
151a0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
151b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
151c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
151d0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
151e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
151f0 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
15200 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
15220 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
15230 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
15240 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
15250 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
15260 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
15270 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
15280 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
15290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
152a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
152b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
152c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
152d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
152e0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
152f0 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  e  STMT N VALUE.
15300 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15310 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
15320 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  le interface.  S
15330 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
15340 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
15350 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
15360 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
15370 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
15380 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
15390 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
153a0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
153b0 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
153c0 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
153d0 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
153e0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
153f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
15400 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15410 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
15420 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
15430 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
15440 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
15450 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f  .  int idx;.  do
15460 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e  uble value;.  in
15470 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
15480 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20  ar *zVal;.  int 
15490 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
154a0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
154b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
154c0 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
154d0 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f   the special flo
154e0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
154f0 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e */.    unsigne
15500 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20  d int iUpper;   
15510 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73  /* Upper 32 bits
15520 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
15530 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f   int iLower;   /
15540 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20  * Lower 32 bits 
15550 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46  */.  } aSpecialF
15560 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22  p[] = {.    {  "
15570 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66  NaN",      0x7ff
15580 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
15590 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61  f },.    {  "SNa
155a0 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66  N",     0x7ff7ff
155b0 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
155c0 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c  ,.    {  "-NaN",
155d0 20 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c       0xffffffff,
155e0 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
155f0 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20     {  "-SNaN",  
15600 20 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78    0xfff7ffff, 0x
15610 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
15620 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30  {  "+Inf",     0
15630 78 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  x7ff00000, 0x000
15640 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
15650 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66  "-Inf",     0xff
15660 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f00000, 0x000000
15670 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70  00 },.    {  "Ep
15680 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30  silon",  0x00000
15690 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
156a0 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69  },.    {  "-Epsi
156b0 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30  lon", 0x80000000
156c0 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a  , 0x00000001 },.
156d0 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20      {  "NaN0",  
156e0 20 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30     0x7ff80000, 0
156f0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
15700 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20   {  "-NaN0",    
15710 30 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30  0xfff80000, 0x00
15720 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a  000000 },.  };..
15730 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
15740 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
15750 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
15760 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
15770 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
15780 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
15790 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
157a0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
157b0 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
157c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
157d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
157e0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
157f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
15800 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
15810 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
15820 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15830 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15840 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
15850 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
15860 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  CL_ERROR;..  /* 
15870 49 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74  Intercept the st
15880 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67  ring "NaN" and g
15890 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61  enerate a NaN va
158a0 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a  lue for it..  **
158b0 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e   All other strin
158c0 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68  gs are passed th
158d0 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74  rough to Tcl_Get
158e0 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e  DoubleFromObj().
158f0 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75  .  ** Tcl_GetDou
15900 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f  bleFromObj() sho
15910 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22  uld understand "
15920 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65  NaN" but some ve
15930 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74  rsions.  ** cont
15940 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a  ain a bug..  */.
15950 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74    zVal = Tcl_Get
15960 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
15970 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
15980 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29  zeof(aSpecialFp)
15990 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  /sizeof(aSpecial
159a0 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  Fp[0]); i++){.  
159b0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70    if( strcmp(aSp
159c0 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65  ecialFp[i].zName
159d0 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zVal)==0 ){.  
159e0 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
159f0 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20  64 x;.      x = 
15a00 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55  aSpecialFp[i].iU
15a10 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c  pper;.      x <<
15a20 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d  = 32;.      x |=
15a30 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69   aSpecialFp[i].i
15a40 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73  Lower;.      ass
15a50 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75  ert( sizeof(valu
15a60 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61  e)==8 );.      a
15a70 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
15a80 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==8 );.      mem
15a90 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20  cpy(&value, &x, 
15aa0 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  8);.      break;
15ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15ac0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63   i>=sizeof(aSpec
15ad0 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
15ae0 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a  pecialFp[0]) &&.
15af0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
15b00 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
15b10 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
15b20 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65  value) ){.    re
15b30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b40 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15b50 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
15b60 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
15b70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15b80 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15b90 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
15ba0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
15bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15bd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
15be0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15bf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15c00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15c10 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
15c20 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a  ull  STMT N.**.*
15c30 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15c40 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74  e3_bind_null int
15c50 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
15c60 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
15c70 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
15c80 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
15c90 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
15ca0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15cb0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
15cc0 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20  ** binds a NULL 
15cd0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
15ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15cf0 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20  est_bind_null(. 
15d00 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15d10 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15d20 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15d30 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15d40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15d50 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
15d60 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
15d70 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  x;.  int rc;..  
15d80 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
15d90 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15da0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15db0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15dc0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
15dd0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
15de0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
15df0 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30  0), " STMT N", 0
15e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15e20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15e30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15e40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15e50 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15e70 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15e80 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15e90 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
15ea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15eb0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15ec0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
15ed0 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73  t, idx);.  if( s
15ee0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15ef0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
15f00 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
15f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15f20 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
15f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15f40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15f50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15f60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
15f70 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
15f80 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20  bind_text  STMT 
15f90 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
15fa0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
15fb0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
15fc0 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
15fd0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
15fe0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
15ff0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
16000 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
16010 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16020 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
16030 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
16040 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e  F-8 string STRIN
16050 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
16060 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
16070 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
16080 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
16090 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
160a0 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ext(.  void * cl
160b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
160c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
160d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
160e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
160f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16100 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16110 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
16120 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
16130 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
16140 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
16150 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16160 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16170 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16180 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
16190 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
161a0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
161b0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
161c0 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
161d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
161e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
161f0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
16200 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16210 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16220 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
16230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16240 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
16250 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16260 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
16270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16280 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
16290 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
162a0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
162b0 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28  , &bytes);.  if(
162c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
162d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
162e0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
162f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16300 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16310 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
16320 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
16330 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  es, SQLITE_TRANS
16340 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c  IENT);.  if( sql
16350 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16360 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
16370 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
16380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16390 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
163a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
163b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
163c0 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
163d0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
163e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
163f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16400 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16410 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
16420 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
16430 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
16440 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
16450 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
16460 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
16470 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
16480 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
16490 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
164a0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
164b0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
164c0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
164d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
164e0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
164f0 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
16500 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
16510 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
16520 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
16530 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
16540 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16550 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20  _bind_text16(.  
16560 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16570 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16580 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16590 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
165a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
165b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
165c0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
165d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
165e0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
165f0 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
16600 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
16610 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  ;..  void (*xDel
16620 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53  )() = (objc==6?S
16630 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c  QLITE_STATIC:SQL
16640 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16650 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74    Tcl_Obj *oStmt
16660 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
16670 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  4];.  Tcl_Obj *o
16680 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  N       = objv[o
16690 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-3];.  Tcl_Ob
166a0 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62  j *oString  = ob
166b0 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63  jv[objc-2];.  Tc
166c0 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20  l_Obj *oBytes   
166d0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
166e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
166f0 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20  & objc!=6){.    
16700 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16710 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16720 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
16730 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
16740 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
16750 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
16760 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
16770 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
16780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
167a0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
167b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
167c0 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74  g(oStmt), &pStmt
167d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
167e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
167f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16800 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20  terp, oN, &idx) 
16810 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16820 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
16830 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
16840 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74  ArrayFromObj(oSt
16850 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  ring, 0);.  if( 
16860 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16870 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73  j(interp, oBytes
16880 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
16890 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
168a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
168b0 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  nd_text16(pStmt,
168c0 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61   idx, (void *)va
168d0 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c  lue, bytes, xDel
168e0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
168f0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
16900 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
16910 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
16920 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16940 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16950 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16960 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
16970 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
16980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16990 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
169a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
169b0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
169c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
169d0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
169e0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
169f0 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
16a00 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
16a10 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
16a20 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
16a30 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
16a40 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16a50 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
16a60 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
16a70 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
16a80 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
16a90 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
16aa0 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
16ab0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
16ac0 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
16ad0 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
16ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
16af0 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
16b00 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16b10 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16b20 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16b30 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16b40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16b50 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16b60 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
16b70 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
16b80 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
16b90 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
16ba0 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
16bb0 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
16bc0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
16bd0 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
16be0 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
16bf0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16c00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16c10 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16c20 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16c30 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16c40 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16c50 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
16c60 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
16c70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16c80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
16c90 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
16ca0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
16cb0 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
16cc0 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
16cd0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16ce0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16cf0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16d00 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16d10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16d20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16d30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16d40 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16d50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16d60 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
16d70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
16d80 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
16d90 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16da0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
16db0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
16dc0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16dd0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
16de0 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
16df0 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
16e00 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
16e10 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
16e20 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
16e30 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
16e40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16e50 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
16e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16e70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16e80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
16e90 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16ea0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
16eb0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
16ec0 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
16ed0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16ee0 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
16ef0 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
16f00 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
16f10 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16f20 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
16f30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16f40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16f50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16f60 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16f70 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16f80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
16f90 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
16fa0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
16fb0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16fc0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
16fd0 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
16fe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
17000 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
17010 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17020 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
17030 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17040 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
17050 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
17060 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
17070 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
17080 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
17090 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
170a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
170b0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
170c0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
170d0 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
170e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
170f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
17100 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
17110 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
17120 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
17130 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
17140 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
17150 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
17160 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
17170 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
17180 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
17190 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
171a0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
171b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
171c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
171d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
171e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
171f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17200 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
17210 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
17220 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
17230 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
17240 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
17250 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
17260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17270 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
17280 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17290 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
172a0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
172b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
172c0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
172d0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
172e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
172f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17300 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
17310 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
17320 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
17330 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
17340 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
17350 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
17360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
17370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17380 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
17390 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
173a0 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
173b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
173c0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
173d0 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
173e0 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
173f0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
17400 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
17410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17420 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
17430 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
17440 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17450 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17460 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17470 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17480 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
17490 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
174a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
174b0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
174c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
174d0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
174e0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
174f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17500 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
17510 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17520 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17530 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17540 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17550 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17560 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
17570 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
17580 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
17590 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
175a0 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
175b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
175c0 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
175d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
175e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
175f0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
17600 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
17610 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
17620 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
17630 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
17640 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
17650 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17660 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17670 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17680 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17690 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
176a0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
176b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
176c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
176d0 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
176e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
176f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
17700 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
17710 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17720 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
17730 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
17740 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
17750 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
17760 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
17770 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
17780 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
17790 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
177a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
177b0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
177c0 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
177d0 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
177e0 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
177f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17800 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17810 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17820 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17830 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17840 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
17850 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
17860 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
17870 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
17880 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
17890 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
178a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
178b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
178c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
178d0 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
178e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
178f0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
17900 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
17910 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
17920 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
17930 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
17940 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17950 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
17960 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42  ended_errcode DB
17970 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17980 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
17990 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
179a0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
179b0 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
179c0 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
179d0 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
179e0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
179f0 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f  ex_errcode(.  vo
17a00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17a10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17a20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17a30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17a40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17a50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
17a60 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
17a70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
17a80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17a90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17aa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17ab0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
17ac0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
17ad0 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
17ae0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17af0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
17b00 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
17b10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17b20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
17b30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17b40 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
17b50 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
17b60 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  code(db);.  Tcl_
17b70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17b80 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
17b90 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
17ba0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17bb0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
17bc0 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63  ge: sqlite3_errc
17bd0 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ode DB.**.** Ret
17be0 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72  urn the string r
17bf0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
17c00 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
17c10 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a   sqlite3_* API.*
17c20 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e  * error code. e.
17c30 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  g. "SQLITE_ERROR
17c40 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
17c50 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20   test_errcode(. 
17c60 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17c70 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17c80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17c90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17ca0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
17cc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
17cd0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
17ce0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17cf0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17d00 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17d10 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
17d20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17d30 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
17d40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17d50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
17d60 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
17d70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17d80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
17d90 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
17da0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
17db0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
17dc0 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  b);.  Tcl_Append
17dd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
17de0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
17df0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
17e00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17e10 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17e20 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44 42  qlite3_errmsg DB
17e30 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
17e40 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65  he UTF-8 represe
17e50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
17e60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
17e70 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
17e80 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
17e90 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a  e3_* API call..*
17ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17eb0 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64  t_errmsg(.  void
17ec0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17ed0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17ee0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17ef0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17f00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17f10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
17f20 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a  st char *zErr;..
17f30 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17f40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17f50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17f60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17f70 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17f80 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17f90 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
17fa0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17fb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17fc0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
17fd0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17fe0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17ff0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
18000 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
18010 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
18020 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c  rrmsg(db);.  Tcl
18030 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18040 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
18050 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29  ingObj(zErr, -1)
18060 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18070 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18080 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73  ge:   test_errms
18090 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  g16 DB.**.** Ret
180a0 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20  urns the UTF-16 
180b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
180c0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
180d0 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
180e0 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
180f0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
18100 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20  call. This is a 
18110 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63  byte array objec
18120 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a  t at the TCL .**
18130 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69   level, and it i
18140 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30  ncludes the 0x00
18150 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
18160 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
18170 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d  d of the.** UTF-
18180 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  16 string..*/.st
18190 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
181a0 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a  rmsg16(.  void *
181b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
181c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
181d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
181e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
181f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
18200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
18210 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
18220 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
18230 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zErr;.  const c
18240 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79  har *z;.  int by
18250 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  tes = 0;..  if( 
18260 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18270 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18280 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
18290 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
182a0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
182b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
182c0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
182d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
182e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
182f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
18300 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
18310 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
18320 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
18330 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
18340 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
18350 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72  6(db);.  if( zEr
18360 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72  r ){.    z = zEr
18370 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73  r;.    for(bytes
18380 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20  =0; z[bytes] || 
18390 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65  z[bytes+1]; byte
183a0 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63  s+=2){}.  }.  Tc
183b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
183c0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
183d0 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
183e0 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66   bytes));.#endif
183f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18400 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
18410 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18420 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18430 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
18440 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
18450 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
18460 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
18470 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
18480 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
18490 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
184a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
184b0 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
184c0 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
184d0 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
184e0 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
184f0 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
18500 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
18510 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
18520 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
18530 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
18540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18550 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20  test_prepare(.  
18560 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18570 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18580 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18590 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
185a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
185b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
185c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
185d0 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  l;.  int bytes;.
185e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
185f0 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
18600 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18610 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
18620 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
18630 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
18640 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
18650 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18660 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18670 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18680 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18690 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
186a0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
186b0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
186c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
186d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
186e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
186f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18700 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18710 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
18720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
18730 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
18740 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
18750 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18760 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18770 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
18780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18790 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
187a0 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
187b0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
187c0 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
187d0 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f  ail : 0);.  Tcl_
187e0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
187f0 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rp);.  if( sqlit
18800 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
18810 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
18820 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18830 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
18840 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
18850 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
18860 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
18870 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
18880 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
18890 28 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c  ( strlen(zTail)<
188a0 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20 62  bytes ){.      b
188b0 79 74 65 73 20 3d 20 73 74 72 6c 65 6e 28 7a 54  ytes = strlen(zT
188c0 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
188d0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
188e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
188f0 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
18900 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
18910 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
18920 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
18940 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
18950 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
18960 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
18970 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18980 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
18990 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
189a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
189b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
189c0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
189d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
189e0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
189f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
18a00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
18a10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
18a20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18a30 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
18a40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
18a50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18a60 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
18a70 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
18a80 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
18a90 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
18aa0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
18ab0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
18ac0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
18ad0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
18ae0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
18af0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
18b00 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
18b10 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
18b20 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
18b30 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
18b40 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
18b50 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
18b60 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
18b70 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
18b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18b90 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
18ba0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18bb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18bc0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18bd0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18be0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18bf0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18c00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18c10 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
18c20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18c30 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
18c40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18c50 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
18c60 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
18c70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
18c80 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
18c90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18ca0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18cb0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18cc0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18cd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18ce0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
18cf0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
18d00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18d10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
18d30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18d40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18d50 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
18d60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
18d70 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
18d80 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
18d90 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18da0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18db0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
18dc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18dd0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
18de0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
18df0 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
18e00 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
18e10 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61  &zTail : 0);.  a
18e20 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
18e30 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
18e40 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
18e50 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
18e60 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18e70 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
18e80 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18e90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18ea0 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
18eb0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
18ec0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
18ed0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a  tes = bytes - (z
18ee0 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
18ef0 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
18f00 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
18f10 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
18f20 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
18f30 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
18f40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
18f60 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
18f70 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
18f80 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
18f90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18fa0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
18fb0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
18fc0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
18fd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18fe0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
18ff0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
19000 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
19010 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
19020 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
19030 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19040 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19050 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19060 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
19070 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19080 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19090 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
190a0 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e  134 DB.**.** Gen
190b0 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64  erate a prepared
190c0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
190d0 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e   zero-byte strin
190e0 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66  g as a test.** f
190f0 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e  or ticket #3134.
19100 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f    The string sho
19110 75 6c 64 20 62 65 20 70 72 65 63 65 65 64 65 64  uld be preceeded
19120 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
19130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19140 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
19150 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
19160 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19170 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19180 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19190 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
191a0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
191b0 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
191c0 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
191d0 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
191e0 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
191f0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19200 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
19210 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
19220 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
19230 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19240 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19250 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19260 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19280 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
19290 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
192a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
192b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
192c0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
192d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
192e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
192f0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
19300 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
19310 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19320 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
19330 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
19340 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
19350 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
19360 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
19370 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
19380 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
19390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
193a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
193b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
193c0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
193d0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
193e0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
193f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19400 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
19410 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
19420 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
19430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19440 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
19450 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
19460 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
19470 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
19480 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
19490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
194a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
194b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
194c0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
194d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
194e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
194f0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44  ite3_prepare16 D
19500 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
19510 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
19520 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
19530 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
19540 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
19550 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
19560 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19570 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
19580 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
19590 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
195a0 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
195b0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
195c0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
195d0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
195e0 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
195f0 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
19600 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
19610 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
19620 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
19630 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19640 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19650 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19660 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19670 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
19680 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
19690 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
196a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
196b0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
196c0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
196d0 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
196e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
196f0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
19700 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
19710 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
19720 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
19730 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
19740 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
19750 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
19760 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
19770 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
19780 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
19790 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
197a0 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
197b0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
197c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
197d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
197e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
197f0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19800 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19810 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
19820 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
19830 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19840 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19850 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19860 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19870 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19880 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19890 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
198a0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
198b0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
198c0 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
198d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
198e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
198f0 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
19900 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19910 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19920 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
19930 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
19940 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
19950 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
19960 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19970 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19980 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
19990 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
199a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
199b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
199c0 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
199d0 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
199e0 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
199f0 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a  bjlen - ((u8 *)z
19a00 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29  Tail-(u8 *)zSql)
19a10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19a20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
19a30 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d     }.    pTail =
19a40 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
19a50 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
19a60 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54  , objlen);.    T
19a70 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
19a80 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  pTail);.    Tcl_
19a90 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
19aa0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70  p, objv[4], 0, p
19ab0 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63  Tail, 0);.    Tc
19ac0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
19ad0 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Tail);.  }..  if
19ae0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
19af0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
19b00 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
19b10 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
19b20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19b30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
19b40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19b50 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
19b60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19b70 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
19b80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19b90 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
19ba0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
19bb0 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
19bc0 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
19bd0 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
19be0 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
19bf0 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
19c00 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
19c10 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
19c20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
19c30 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
19c40 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
19c50 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
19c60 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
19c70 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
19c80 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
19c90 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
19ca0 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
19cb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
19cc0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
19cd0 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20 76  repare16_v2(.  v
19ce0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19cf0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19d00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19d10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19d20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
19d30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19d40 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
19d50 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19d60 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
19d70 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
19d80 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
19d90 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
19da0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19db0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
19dc0 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
19dd0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19df0 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
19e00 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
19e10 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e30 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
19e40 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
19e50 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
19e60 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
19e70 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19e90 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19ea0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19eb0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19ec0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
19ed0 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
19ee0 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
19ef0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19f00 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19f10 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19f20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19f30 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19f40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19f50 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
19f60 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
19f70 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c  j(objv[2], &objl
19f80 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  en);.  if( Tcl_G
19f90 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19fa0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
19fb0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
19fc0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
19fd0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
19fe0 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  e16_v2(db, zSql,
19ff0 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1a000 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1a010 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c   : 0);.  if( sql
1a020 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1a030 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1a040 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a050 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
1a060 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a070 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a080 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1a090 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
1a0a0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
1a0b0 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69  en - ((u8 *)zTai
1a0c0 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1a0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a0e0 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1a0f0 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1a100 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1a110 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1a120 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1a130 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1a140 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1a150 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1a160 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1a170 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1a180 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1a190 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1a1a0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1a1b0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1a1c0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1a1d0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1a1e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a1f0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1a200 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a210 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1a220 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a230 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1a240 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a250 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1a260 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
1a270 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
1a280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a290 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
1a2a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a2b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a2c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1a2d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1a2e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1a2f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a300 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
1a310 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
1a320 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1a330 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
1a340 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
1a350 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1a360 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a370 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a380 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a390 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a3a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a3b0 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1a3c0 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1a3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a3e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1a3f0 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
1a400 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
1a410 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
1a420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
1a430 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
1a440 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1a450 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a460 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a470 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1a480 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1a490 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a4a0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1a4b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1a4c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a4d0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
1a4e0 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
1a4f0 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
1a500 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
1a510 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a520 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a530 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a540 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a550 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a570 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
1a580 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
1a590 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1a5a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1a5b0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1a5c0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1a5d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a5e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a5f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a600 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1a610 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1a620 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
1a630 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
1a640 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
1a650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a660 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
1a670 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1a680 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
1a690 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  ], 0);.  rc = sq
1a6a0 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
1a6b0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1a6c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a6d0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1a6e0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1a6f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a700 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1a710 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a720 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1a730 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a740 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1a750 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a760 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1a770 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
1a780 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
1a790 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1a7a0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
1a7b0 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
1a7c0 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
1a7d0 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
1a7e0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1a7f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d  tic int test_com
1a800 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
1a810 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1a820 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a830 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1a840 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1a850 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21   objv[].){.#if !
1a860 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a870 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26  MIT_COMPLETE) &&
1a880 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a890 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63  _OMIT_UTF16).  c
1a8a0 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
1a8b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1a8c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1a8d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1a8e0 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
1a8f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1a900 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a910 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54   zBuf = (char*)T
1a920 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1a930 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
1a940 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
1a950 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1a960 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1a970 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
1a980 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20  zBuf)));.#endif 
1a990 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1a9a0 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54  OMPLETE && SQLIT
1a9b0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1a9c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1a9e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54   sqlite3_step ST
1a9f0 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
1aa00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1aa10 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
1aa20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1aa30 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20  st_step(.  void 
1aa40 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1aa50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1aa60 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1aa70 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1aa80 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1aa90 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1aaa0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1aab0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1aac0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1aad0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1aae0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1aaf0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1ab00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ab10 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22  bjv[0]), " STMT"
1ab20 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ab30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ab40 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1ab50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1ab60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ab70 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1ab80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ab90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1aba0 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
1abb0 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49   /* if( rc!=SQLI
1abc0 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53  TE_DONE && rc!=S
1abd0 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75  QLITE_ROW ) retu
1abe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f  rn TCL_ERROR; */
1abf0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1ac00 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1ac10 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1ac20 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1ac30 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
1ac40 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20   int test_sql(. 
1ac50 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ac60 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ac70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ac80 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ac90 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1aca0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1acb0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1acc0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1acd0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1ace0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1acf0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1ad00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ad10 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1ad20 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1ad30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ad40 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1ad50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ad60 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
1ad70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1ad80 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c  ar *)sqlite3_sql
1ad90 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c  (pStmt), TCL_VOL
1ada0 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e  ATILE);.  return
1adb0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1adc0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1add0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
1ade0 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
1adf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1ae00 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
1ae10 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
1ae20 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
1ae30 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1ae40 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lumn_count(.  vo
1ae50 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ae60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ae70 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1ae80 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ae90 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1aea0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1aeb0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1aec0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1aed0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1aee0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1aef0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1af00 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1af10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1af20 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1af30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1af40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1af50 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1af60 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1af70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1af80 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1af90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1afa0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1afb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1afc0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1afd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
1afe0 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1aff0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b000 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b010 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
1b020 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1b030 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
1b040 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e  e of the data in
1b050 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1b060 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1b070 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1b080 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  nt test_column_t
1b090 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
1b0a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b0b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b0c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b0d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b0e0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b0f0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1b100 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
1b110 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
1b120 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1b130 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b140 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b150 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b160 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b170 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b180 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1b190 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b1a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b1b0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1b1c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b1d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b1e0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1b1f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b200 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b210 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b220 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1b230 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b240 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
1b250 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1b260 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
1b270 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
1b280 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
1b290 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
1b2a0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1b2b0 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
1b2c0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1b2d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b2e0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
1b2f0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1b300 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
1b310 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1b320 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b330 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
1b340 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
1b350 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1b360 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
1b370 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1b380 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1b390 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
1b3a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1b3b0 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
1b3c0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1b3d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b3e0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
1b3f0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1b400 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
1b410 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1b420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b430 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1b440 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
1b450 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b470 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1b480 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
1b490 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1b4a0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1b4b0 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1b4c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1b4d0 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
1b4e0 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
1b4f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1b500 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e  t test_column_in
1b510 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
1b520 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b530 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b540 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b550 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b560 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b570 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1b580 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69  int col;.  i64 i
1b590 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1b5a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1b5b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b5c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1b5d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b5e0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1b5f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1b600 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1b610 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1b620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b630 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1b640 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1b650 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b660 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1b670 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b680 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1b690 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1b6a0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
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 0a 20 20 69 56 61 6c 20 3d 20 73  ROR;..  iVal = s
1b6d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1b6e0 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  t64(pStmt, col);
1b6f0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1b700 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1b710 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56  NewWideIntObj(iV
1b720 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1b730 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b740 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1b750 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20  olumn_blob STMT 
1b760 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1b770 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1b780 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
1b790 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b7a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b7b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b7c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b7d0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1b7e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1b7f0 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e    int col;..  in
1b800 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76  t len;.  const v
1b810 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69  oid *pBlob;..  i
1b820 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1b830 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b840 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b850 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b860 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1b870 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b880 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1b890 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1b8a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b8b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1b8c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1b8d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1b8e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1b8f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1b900 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1b910 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1b920 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1b930 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1b940 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c   TCL_ERROR;..  l
1b950 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
1b960 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1b970 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d   col);.  pBlob =
1b980 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1b990 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29  blob(pStmt, col)
1b9a0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1b9b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1b9c0 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1b9d0 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20  (pBlob, len));. 
1b9e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ba00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1ba10 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ouble STMT colum
1ba20 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1ba30 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1ba40 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1ba50 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1ba60 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a  st as a double..
1ba70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ba80 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
1ba90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1baa0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bab0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1bac0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1bad0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1bae0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1baf0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1bb00 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72   col;.  double r
1bb10 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1bb20 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1bb30 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1bb40 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1bb50 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1bb60 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1bb70 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1bb80 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1bb90 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1bba0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1bbb0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1bbc0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1bbd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bbe0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1bbf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bc00 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1bc10 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1bc20 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1bc30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1bc40 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73  ROR;..  rVal = s
1bc50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1bc60 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  uble(pStmt, col)
1bc70 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1bc80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1bc90 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56  _NewDoubleObj(rV
1bca0 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1bcb0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1bcc0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
1bcd0 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  ata_count STMT .
1bce0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1bcf0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1bd00 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
1bd10 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
1bd20 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
1bd30 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63   int test_data_c
1bd40 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
1bd50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bd60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bd70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1bd80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1bd90 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1bda0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
1bdb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1bdc0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1bdd0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1bde0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1bdf0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1be00 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1be10 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1be20 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1be30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1be40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1be50 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1be60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1be70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1be80 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1be90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
1bea0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1beb0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1bec0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61  ntObj(sqlite3_da
1bed0 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  ta_count(pStmt))
1bee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bef0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bf00 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1bf10 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1bf20 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1bf30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1bf40 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1bf50 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1bf60 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1bf70 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1bf80 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1bf90 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
1bfa0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bfb0 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
1bfc0 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
1bfd0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
1bfe0 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
1bff0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c000 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c010 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c020 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c030 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c040 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
1c050 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
1c060 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1c070 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
1c080 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
1c090 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
1c0a0 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
1c0b0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1c0c0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1c0d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1c0e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1c0f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1c100 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1c110 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1c120 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c130 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1c140 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1c150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c160 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c170 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c180 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c190 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c1a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c1b0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1c1c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1c1d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1c1e0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1c1f0 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
1c200 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1c210 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
1c220 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
1c230 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1c240 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
1c250 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1c260 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1c270 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
1c280 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
1c290 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c2a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c2b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c2c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c2d0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1c2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1c2f0 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
1c300 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
1c310 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1c320 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1c330 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
1c340 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c350 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
1c360 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1c370 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
1c380 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1c390 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1c3a0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1c3b0 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
1c3c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c3d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1c3e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1c3f0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1c400 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c410 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1c420 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1c430 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c440 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
1c450 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1c460 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1c470 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69  tmt_utf16(.  voi
1c480 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1c490 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c4a0 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1c4b0 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1c4c0 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
1c4d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c4e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c4f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c500 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1c510 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1c520 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c530 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1c540 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
1c550 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1c560 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20  Name16;.  const 
1c570 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73  void *(*xFunc)(s
1c580 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1c590 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1c5a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28  const void *(*)(
1c5b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1c5c0 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1c5d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1c5e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c5f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c600 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c610 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1c620 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1c630 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1c640 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1c650 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c660 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c670 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1c680 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c690 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c6a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1c6b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1c6c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1c6d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1c6e0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1c6f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1c700 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e    zName16 = xFun
1c710 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1c720 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a   if( zName16 ){.
1c730 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63      int n;.    c
1c740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1c750 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28  Name16;.    for(
1c760 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e  n=0; z[n] || z[n
1c770 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20  +1]; n+=2){}.   
1c780 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
1c790 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d  yteArrayObj(zNam
1c7a0 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54  e16, n+2);.    T
1c7b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c7c0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
1c7d0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1c7e0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c7f0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  /..  return TCL_
1c800 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c810 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1c820 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
1c830 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1c840 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c850 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
1c860 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1c870 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1c880 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
1c890 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
1c8a0 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
1c8b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c8c0 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
1c8d0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1c8e0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1c8f0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1c900 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c910 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c920 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c930 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1c940 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1c950 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
1c960 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
1c970 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
1c980 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28    xFunc = (int (
1c990 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1c9a0 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1c9b0 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1c9c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c9d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c9e0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c9f0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1ca00 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1ca10 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1ca20 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1ca30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ca40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1ca50 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1ca60 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1ca70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ca80 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1ca90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1caa0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1cab0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1cac0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1cad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cae0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1caf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1cb00 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
1cb10 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
1cb20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cb30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cb40 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  :  sqlite_set_ma
1cb50 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e  gic  DB  MAGIC-N
1cb60 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20  UMBER.**.** Set 
1cb70 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61  the db->magic va
1cb80 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  lue.  This is us
1cb90 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  ed to test error
1cba0 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e   recovery logic.
1cbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1cbc0 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28  qlite_set_magic(
1cbd0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1cbe0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1cbf0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1cc00 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1cc10 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1cc20 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1cc30 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1cc40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1cc50 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1cc60 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1cc70 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1cc80 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43        " DB MAGIC
1cc90 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cca0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ccb0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1ccc0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1ccd0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1cce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ccf0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1cd00 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1cd10 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20  C_OPEN")==0 ){. 
1cd20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1cd30 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1cd40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1cd50 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1cd60 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
1cd70 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  ED")==0 ){.    d
1cd80 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1cd90 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
1cda0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1cdb0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1cdc0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29  ITE_MAGIC_BUSY")
1cdd0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1cde0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1cdf0 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  GIC_BUSY;.  }els
1ce00 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1ce10 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1ce20 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29  GIC_ERROR")==0 )
1ce30 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1ce40 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
1ce50 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
1ce60 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1ce70 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69  erp, argv[2], (i
1ce80 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20  nt*)&db->magic) 
1ce90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1cea0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1ceb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1cec0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1ced0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1cee0 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
1cef0 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
1cf00 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
1cf10 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
1cf20 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
1cf30 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1cf40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cf50 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1cf60 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1cf70 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1cf80 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1cf90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cfa0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1cfb0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1cfc0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1cfd0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1cfe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1d000 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1d010 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1d020 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d030 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
1d040 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
1d050 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d060 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
1d070 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1d080 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
1d090 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
1d0a0 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
1d0b0 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
1d0c0 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
1d0d0 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1d0e0 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
1d0f0 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
1d100 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 3b  <sizeof(bigBuf);
1d110 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20   i++) bigBuf[i] 
1d120 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20  = 0xdeadbeef;.  
1d130 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1d140 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62  seline = (u8*)&b
1d150 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a  igBuf[65536];.}.
1d160 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
1d170 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70  urrent stack dep
1d180 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  th.  Used for de
1d190 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
1d1a0 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63  .u64 sqlite3Stac
1d1b0 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20  kDepth(void){.  
1d1c0 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28  u8 x;.  return (
1d1d0 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61  u64)(sqlite3_sta
1d1e0 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78  ck_baseline - &x
1d1f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
1d200 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  e:  sqlite3_stac
1d210 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a  k_used DB SQL.**
1d220 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75  .** Try to measu
1d230 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  re the amount of
1d240 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65   stack space use
1d250 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
1d260 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73  qlite3_exec.*/.s
1d270 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1d280 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69  tack_used(.  voi
1d290 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d2a0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d2b0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1d2c0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1d2d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1d2e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1d2f0 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1d300 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d310 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1d320 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1d330 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1d340 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51  .        " DB SQ
1d350 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
1d360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d370 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1d380 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1d390 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1d3a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d3b0 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20   prepStack();.  
1d3c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
1d3d0 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
1d3e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
1d3f0 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26  i=65535; i>=0 &&
1d400 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f   ((u32*)sqlite3_
1d410 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b  stack_baseline)[
1d420 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b  -i]==0xdeadbeef;
1d430 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65   i--){}.  Tcl_Se
1d440 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d450 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1d460 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  (i*4));.  return
1d470 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d480 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1d490 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
1d4a0 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1d4b0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
1d4c0 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1d4d0 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
1d4e0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1d4f0 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
1d500 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1d510 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1d520 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1d530 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
1d540 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
1d550 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
1d560 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1d570 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1d580 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74  int delete_funct
1d590 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1d5a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d5b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d5c0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1d5d0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1d5e0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1d5f0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1d600 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d610 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d620 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d630 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d640 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1d650 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1d660 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1d670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d680 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1d690 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1d6a0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1d6b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d6c0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1d6d0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1d6e0 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1d6f0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1d700 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
1d710 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1d720 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1d730 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1d740 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1d750 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d760 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d770 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
1d780 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f  tion DB collatio
1d790 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1d7a0 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ete the collatio
1d7b0 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c  n sequence 'coll
1d7c0 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ation-name' from
1d7d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1d7e0 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61   .** DB. It is a
1d7f0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1d800 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d810 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61  ce was created a
1d820 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20  s UTF8 (the .** 
1d830 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1d840 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1d850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1d860 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  lete_collation(.
1d870 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d880 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d890 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d8a0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1d8b0 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1d8c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1d8d0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1d8e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d8f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1d900 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1d910 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1d920 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1d930 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1d940 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1d950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d960 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1d970 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1d980 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1d990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1d9b0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
1d9c0 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49  b, argv[2], SQLI
1d9d0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a  TE_UTF8, 0, 0);.
1d9e0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1d9f0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1da00 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1da10 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1da20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1da30 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1da40 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1da50 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52  ommit DB.**.** R
1da60 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1da70 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73  e database DB is
1da80 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75   currently in au
1da90 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1daa0 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1dab0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1dac0 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f  c int get_autoco
1dad0 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
1dae0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1daf0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1db00 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1db10 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1db20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1db30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1db40 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1db50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1db60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1db70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1db80 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1db90 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1dba0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1dbb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1dbc0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1dbd0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1dbe0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1dbf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dc00 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
1dc10 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  d", sqlite3_get_
1dc20 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b  autocommit(db));
1dc30 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1dc40 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1dc50 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1dc60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1dc70 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
1dc80 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d  usy_timeout DB M
1dc90 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  S.**.** Set the 
1dca0 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54  busy timeout.  T
1dcb0 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69  his is more easi
1dcc0 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68  ly done using th
1dcd0 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74  e timeout.** met
1dce0 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69  hod of the TCL i
1dcf0 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77  nterface.  But w
1dd00 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20  e need a way to 
1dd10 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a  test the case.**
1dd20 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e   where it return
1dd30 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
1dd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1dd50 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
1dd60 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1dd70 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1dd80 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1dd90 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1dda0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1ddb0 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65  rc, ms;.  sqlite
1ddc0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1ddd0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1dde0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ddf0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1de00 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1de10 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1de20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1de30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1de40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1de50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1de60 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1de70 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1de80 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1de90 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1dea0 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  argv[2], &ms) ) 
1deb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dec0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ded0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
1dee0 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , ms);.  Tcl_App
1def0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1df00 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
1df10 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1df20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1df30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1df40 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
1df50 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45  ype VARIABLENAME
1df60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1df70 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1df80 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
1df90 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
1dfa0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69   value of the gi
1dfb0 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ven variable..*/
1dfc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f  .static int tcl_
1dfd0 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20  variable_type(. 
1dfe0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1dff0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e000 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e010 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e020 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e030 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72  .  Tcl_Obj *pVar
1e040 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1e050 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e060 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e070 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42  1, objv, "VARIAB
1e080 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
1e090 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e0a0 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74    pVar = Tcl_Get
1e0b0 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54  Var2Ex(interp, T
1e0c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e0d0 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45  v[1]), 0, TCL_LE
1e0e0 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20  AVE_ERR_MSG);.  
1e0f0 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65  if( pVar==0 ) re
1e100 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e110 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65    if( pVar->type
1e120 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ptr ){.    Tcl_S
1e130 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e140 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
1e150 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50  gObj(pVar->typeP
1e160 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  tr->name, -1));.
1e170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1e180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e190 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
1e1a0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f  lease_memory ?N?
1e1b0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1e1c0 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1e1d0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1e1e0 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
1e1f0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68   required..** Th
1e200 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74  e integer N is t
1e210 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e220 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  es we are trying
1e230 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68   to release.  Th
1e240 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  e .** return val
1e250 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  ue is the amount
1e260 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61   of memory actua
1e270 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  lly released..*/
1e280 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1e290 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1e2a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e2b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e2c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e2d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1e2e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1e2f0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1e300 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1e310 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
1e320 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1e330 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
1e340 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
1e350 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1e360 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1e370 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1e380 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1e390 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1e3a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e3b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
1e3c0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
1e3d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1e3e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1e3f0 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
1e400 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
1e410 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
1e420 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1e430 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1e440 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
1e450 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1e460 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1e470 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
1e480 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e490 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e4a0 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1e4b0 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
1e4c0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
1e4d0 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
1e4e0 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
1e4f0 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
1e500 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
1e510 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
1e520 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
1e530 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
1e540 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
1e550 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e560 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
1e570 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
1e580 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e590 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e5a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e5b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e5c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
1e5d0 63 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c 69  c int softHeapLi
1e5e0 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  mit = 0;.  int a
1e5f0 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1e600 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1e610 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1e620 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1e630 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1e640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e650 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  OR;.  }.  amt = 
1e660 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a 20  softHeapLimit;. 
1e670 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
1e680 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 69      int N;.    i
1e690 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1e6a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1e6b0 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1e6c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e6d0 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
1e6e0 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20 20  eap_limit(N);.  
1e6f0 20 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 20    softHeapLimit 
1e700 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  = N;.  }.  Tcl_S
1e710 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e720 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e730 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72  j(amt));.  retur
1e740 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e750 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1e760 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1e770 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  up.**.** Call th
1e780 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
1e790 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f  _cleanup API..*/
1e7a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1e7b0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1e7c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e7d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e7e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e7f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1e800 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1e810 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1e820 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1e830 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  D.  sqlite3_thre
1e840 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65  ad_cleanup();.#e
1e850 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1e860 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e870 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1e880 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
1e890 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1e8a0 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65   a list of numbe
1e8b0 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  rs which are the
1e8c0 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66   PagerRefcount f
1e8d0 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73  or all.** pagers
1e8e0 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
1e8f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
1e900 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1e910 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
1e920 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e930 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e940 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e950 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e960 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e970 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1e980 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
1e990 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f  t v, *a;.  Tcl_O
1e9a0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20  bj *pResult;..  
1e9b0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1e9c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e9d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e9e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e9f0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1ea00 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1ea10 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1ea20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
1ea30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ea40 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1ea50 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1ea60 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1ea70 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1ea80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ea90 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d  ROR;.  pResult =
1eaa0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
1eab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1eac0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
1ead0 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
1eae0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  t==0 ){.      v 
1eaf0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1eb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1eb10 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1eb20 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d  utex);.      a =
1eb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61   sqlite3PagerSta
1eb40 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
1eb50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  ager(db->aDb[i].
1eb60 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d  pBt));.      v =
1eb70 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c   a[0];.      sql
1eb80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1eb90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1eba0 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
1ebb0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1ebc0 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
1ebd0 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
1ebe0 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
1ebf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1ec00 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
1ec10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1ec20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
1ec30 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
1ec40 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
1ec50 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
1ec60 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
1ec70 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
1ec80 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
1ec90 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
1eca0 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
1ecb0 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
1ecc0 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
1ecd0 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
1ece0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1ecf0 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
1ed00 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
1ed10 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
1ed20 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
1ed30 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
1ed40 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
1ed50 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
1ed60 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
1ed70 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
1ed80 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
1ed90 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
1eda0 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
1edb0 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
1edc0 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
1edd0 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
1ede0 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
1edf0 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
1ee00 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
1ee10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ee20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1ee30 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1ee40 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1ee50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1ee60 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1ee70 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1ee80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1ee90 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1eea0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1eeb0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1eec0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1eed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1eee0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1eef0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1ef00 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ef10 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1ef20 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
1ef30 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a  cl_Obj *pTestObj
1ef40 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20  ;.  int working 
1ef50 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a  = 0;..  pTestObj
1ef60 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
1ef70 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36  tObj(1000000*(i6
1ef80 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20  4)1234567890);. 
1ef90 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d   working = strcm
1efa0 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
1efb0 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34  pTestObj), "1234
1efc0 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d  567890000000")==
1efd0 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  0;.  Tcl_DecrRef
1efe0 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b  Count(pTestObj);
1eff0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1f000 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1f010 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f  NewBooleanObj(wo
1f020 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72  rking));.  retur
1f030 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
1f040 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
1f050 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a  s_unlink_test.**
1f060 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
1f070 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73  mand unregisters
1f080 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53   the primary VFS
1f090 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74   and then regist
1f0a0 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61  ers.** it back a
1f0b0 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75  gain.  This is u
1f0c0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
1f0d0 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73  ability to regis
1f0e0 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65  ter a.** VFS whe
1f0f0 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69  n none are previ
1f100 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
1f110 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74  , and the abilit
1f120 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73  y to .** unregis
1f130 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61  ter the only ava
1f140 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63  ilable VFS.  Tic
1f150 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61  ket #2738.*/.sta
1f160 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69  tic int vfs_unli
1f170 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nk_test(.  Clien
1f180 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1f190 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1f1a0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1f1b0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1f1c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f1d0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1f1e0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1f1f0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1f200 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1f210 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1f220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f230 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1f240 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f250 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1f260 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1f270 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
1f280 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e  lite3_vfs *pMain
1f290 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
1f2a0 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71  *apVfs[20];.  sq
1f2b0 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74  lite3_vfs one, t
1f2c0 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  wo;..  sqlite3_v
1f2d0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29  fs_unregister(0)
1f2e0 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ;   /* Unregiste
1f2f0 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72  r of NULL is har
1f300 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a  mless */.  one.z
1f310 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
1f320 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f    two.zName = "_
1f330 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c  _two";..  /* Cal
1f340 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ling sqlite3_vfs
1f350 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32  _register with 2
1f360 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30  nd argument of 0
1f370 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63   does not.  ** c
1f380 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
1f390 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61  t VFS.  */.  pMa
1f3a0 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  in = sqlite3_vfs
1f3b0 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69  _find(0);.  sqli
1f3c0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1f3d0 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73  (&one, 0);.  ass
1f3e0 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
1f3f0 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
1f400 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1f410 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1f420 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a  ister(&two, 0);.
1f430 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
1f440 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
1f450 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1f460 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e   );..  /* We can
1f470 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69   find a VFS by i
1f480 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73  ts name */.  ass
1f490 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1f4a0 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
1f4b0 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
1f4c0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1f4d0 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
1f4e0 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  o );..  /* Calli
1f4f0 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65  ng sqlite_vfs_re
1f500 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d  gister with non-
1f510 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61  zero second para
1f520 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68  meter changes th
1f530 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56  e.  ** default V
1f540 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  FS, even if the 
1f550 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  1st parameter is
1f560 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20   an existig VFS 
1f570 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65  that is.  ** pre
1f580 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
1f590 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65  ed as the non-de
1f5a0 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  fault..  */.  sq
1f5b0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1f5c0 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61  er(&one, 1);.  a
1f5d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1f5e0 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
1f5f0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
1f600 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1f610 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
1f620 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
1f630 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1f640 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  d(0)==&one );.  
1f650 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1f660 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20  ster(&two, 1);. 
1f670 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f680 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1f690 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
1f6a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1f6b0 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
1f6c0 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72  =&two );.  asser
1f6d0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1f6e0 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a  ind(0)==&two );.
1f6f0 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20    if( pMain ){. 
1f700 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1f710 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31  egister(pMain, 1
1f720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1f730 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1f740 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
1f750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1f760 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1f770 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
1f780 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1f790 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1f7a0 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20  ==pMain );.  }. 
1f7b0 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68   .  /* Unlink th
1f7c0 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20  e default VFS.  
1f7d0 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
1f7e0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56  re are no more V
1f7f0 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74  FSes.  ** regist
1f800 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ered..  */.  for
1f810 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
1f820 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
1f830 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  fs[0]); i++){.  
1f840 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
1f850 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1f860 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
1f870 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i] ){.      asse
1f880 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
1f890 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61  lite3_vfs_find(a
1f8a0 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20  pVfs[i]->zName) 
1f8b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f8c0 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1f8d0 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20  apVfs[i]);.     
1f8e0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1f8f0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
1f900 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
1f910 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1f920 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
1f930 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1f940 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20   .  /* Register 
1f950 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20  the main VFS as 
1f960 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c  non-default (wil
1f970 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c  l be made defaul
1f980 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74  t, since.  ** it
1f990 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  'll be the only 
1f9a0 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65  one in existence
1f9b0 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
1f9c0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
1f9d0 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65  Main, 0);.  asse
1f9e0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1f9f0 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
1fa00 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67  ;.  .  /* Un-reg
1fa10 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56  ister the main V
1fa20 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74  FS again to rest
1fa30 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53  ore an empty VFS
1fa40 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
1fa50 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1fa60 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65  r(pMain);.  asse
1fa70 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
1fa80 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
1fa90 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56   /* Relink all V
1faa0 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  FSes in reverse 
1fab0 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f  order. */  .  fo
1fac0 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73  r(i=sizeof(apVfs
1fad0 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
1fae0 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ])-1; i>=0; i--)
1faf0 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  {.    if( apVfs[
1fb00 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i] ){.      sqli
1fb10 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1fb20 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20  (apVfs[i], 1);. 
1fb30 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
1fb40 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
1fb50 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
1fb60 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
1fb70 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
1fb80 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
1fb90 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
1fba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  .  }..  /* Unreg
1fbb0 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65  ister out sample
1fbc0 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   VFSes. */.  sql
1fbd0 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1fbe0 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c  ter(&one);.  sql
1fbf0 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1fc00 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a  ter(&two);..  /*
1fc10 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61   Unregistering a
1fc20 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74   VFS that is not
1fc30 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
1fc40 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73  tered is harmles
1fc50 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
1fc60 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
1fc70 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
1fc80 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
1fc90 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  wo);.  assert( s
1fca0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1fcb0 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20  "__one")==0 );. 
1fcc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fcd0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
1fce0 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ")==0 );..  /* W
1fcf0 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74  e should be left
1fd00 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e   with the origin
1fd10 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62  al default VFS b
1fd20 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ack as the.  ** 
1fd30 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73  original */.  as
1fd40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1fd50 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e  s_find(0)==pMain
1fd60 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
1fd70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
1fd80 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69  clcmd:   vfs_ini
1fd90 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  tfail_test.**.**
1fda0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
1fdb0 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66  d attempts to vf
1fdc0 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72  s_find and vfs_r
1fdd0 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65  egister when the
1fde0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  .** sqlite3_init
1fdf0 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61  ialize() interfa
1fe00 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20  ce is failing.  
1fe10 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64  All calls should
1fe20 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   fail..*/.static
1fe30 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69   int vfs_initfai
1fe40 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
1fe50 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1fe60 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1fe70 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1fe80 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1fe90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fea0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1feb0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1fec0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1fed0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1fee0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1fef0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ff00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1ff10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ff20 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1ff30 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1ff40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1ff50 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  one;.  one.zName
1ff60 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69   = "__one";..  i
1ff70 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
1ff80 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
1ff90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1ffa0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1ffb0 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66  r(&one, 0);.  if
1ffc0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1ffd0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
1ffe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
1fff0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
20000 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28  (&one, 1);.  if(
20010 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
20020 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
20030 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
20040 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
20050 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a  ** Saved VFSes.*
20060 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
20070 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
20080 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73  .static int nVfs
20090 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c   = 0;../*.** tcl
200a0 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67  cmd:   vfs_unreg
200b0 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20  ister_all.**.** 
200c0 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56  Unregister all V
200d0 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  FSes..*/.static 
200e0 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74  int vfs_unregist
200f0 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74  er_all(.  Client
20100 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
20110 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
20120 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
20130 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
20140 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20150 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20160 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
20170 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
20180 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
20190 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
201a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
201b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
201c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
201d0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
201e0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
201f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
20200 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
20210 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a  e(apVfs); i++){.
20220 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73      apVfs[i] = s
20230 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20240 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66  0);.    if( apVf
20250 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  s[i]==0 ) break;
20260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
20270 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
20280 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66  s[i]);.  }.  nVf
20290 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20  s = i;.  return 
202a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
202b0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65  tclcmd:   vfs_re
202c0 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
202d0 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56  ** Restore all V
202e0 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72  FSes that were r
202f0 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73  emoved using vfs
20300 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _unregister_all.
20310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
20320 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
20330 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
20340 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
20350 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
20360 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
20370 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
20380 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
20390 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
203a0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
203b0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
203c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
203e0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
203f0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
20400 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
20410 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
20420 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
20430 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
20440 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVfs; i++){.  
20450 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
20460 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c  gister(apVfs[i],
20470 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
20480 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20490 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
204a0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
204b0 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
204c0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
204d0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
204e0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
204f0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
20500 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
20510 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
20520 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
20530 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  t file_control_t
20540 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
20550 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
20560 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
20570 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
20580 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
20590 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
205a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
205b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
205c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
205d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
205e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
205f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
20600 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
20610 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20620 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
20630 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
20640 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
20650 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
20660 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
20670 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
20680 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20690 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
206a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
206b0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
206c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
206d0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
206e0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
206f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20700 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
20710 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
20720 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
20730 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
20740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
20760 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
20770 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20  0, 0, &iArg);.  
20780 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20790 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
207a0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
207b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74  control(db, "not
207c0 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49  adatabase", SQLI
207d0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
207e0 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  TE, &iArg);.  as
207f0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
20800 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d  _ERROR );.  rc =
20810 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
20820 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
20830 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20  , -1, &iArg);.  
20840 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20850 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
20860 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
20870 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d  control(db, "tem
20880 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  p", -1, &iArg);.
20890 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
208a0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
208b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
208c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
208d0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
208e0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20  _lasterrno_test 
208f0 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
20900 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
20910 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
20920 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
20930 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
20940 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
20950 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
20960 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72  E_LAST_ERRNO ver
20970 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
20980 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
20990 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20  sterrno_test(.  
209a0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
209b0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
209c0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
209d0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
209e0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
209f0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
20a00 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
20a10 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
20a20 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
20a30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
20a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20a50 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
20a60 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
20a70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
20a80 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
20a90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
20aa0 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
20ab0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
20ac0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
20ad0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
20ae0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
20af0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
20b00 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
20b10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
20b20 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
20b30 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
20b40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20b50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
20b60 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
20b70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20b80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20b90 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
20ba0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20bb0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
20bc0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
20bd0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c  , NULL, SQLITE_L
20be0 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67  AST_ERRNO, &iArg
20bf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
20c00 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
20c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
20c20 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
20c30 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
20c40 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69  _ERROR; .  }.  i
20c50 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20  f( iArg!=0 ) {. 
20c60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20c70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65  ult(interp, "Une
20c80 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f  xpected non-zero
20c90 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20   errno: ",.     
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
20cc0 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f  mObj(Tcl_NewIntO
20cd0 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20  bj(iArg), 0), " 
20ce0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
20cf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20d00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
20d10 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
20d20 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
20d30 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
20d40 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
20d50 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
20d60 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
20d70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
20d80 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
20d90 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
20da0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
20db0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
20dc0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
20dd0 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
20de0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
20df0 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
20e00 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
20e10 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
20e20 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
20e30 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
20e40 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
20e50 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
20e60 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
20e70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
20e80 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
20e90 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
20ea0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
20eb0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
20ec0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
20ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
20ee0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
20ef0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20f00 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
20f10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
20f20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69   /* New chunk si
20f50 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
20f60 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
20f70 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
20f80 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
20f90 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
20fa0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fc0 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
20fd0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
21000 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
21010 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
21020 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
21030 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
21040 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
21050 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
21060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21070 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
21080 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
21090 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
210a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
210b0 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
210c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
210d0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
210e0 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
210f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21100 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
21110 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
21120 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
21130 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
21140 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
21150 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
21160 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
21170 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
21180 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  ZE, (void *)&nSi
21190 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
211a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
211b0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
211c0 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72   *)sqlite3TestEr
211d0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
211e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
211f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
21210 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
21220 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
21230 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
21240 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a  est DB PWD.**.**
21250 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
21260 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
21270 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
21280 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
21290 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
212a0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
212b0 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  he SQLITE_GET_LO
212c0 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a  CKPROXYFILE and.
212d0 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  ** SQLITE_SET_LO
212e0 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62  CKPROXYFILE verb
212f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
21300 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
21310 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20  ckproxy_test(.  
21320 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
21330 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
21340 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
21350 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
21360 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
21370 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
21380 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
21390 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
213a0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
213b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
213c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
213d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
213e0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
213f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
21400 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
21410 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
21420 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
21430 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 69 6e 74  har *zPwd;.  int
21440 20 6e 50 77 64 3b 0a 20 20 0a 20 20 69 66 28 20   nPwd;.  .  if( 
21450 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
21460 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
21470 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
21480 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
21490 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20   \"",.          
214a0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
214b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
214c0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
214d0 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20  B PWD", 0);.    
214e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
214f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
21500 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
21510 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21520 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
21530 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
21540 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 77 64  RROR;.  }.  zPwd
21550 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
21560 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
21570 20 26 6e 50 77 64 29 3b 0a 20 20 0a 23 69 66 20   &nPwd);.  .#if 
21580 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21590 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
215a0 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69  TYLE).#  if defi
215b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
215c0 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
215d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
215e0 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65  _STYLE 1.#  else
215f0 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
21600 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
21610 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e  NG_STYLE 0.#  en
21620 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  dif.#endif.#if S
21630 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
21640 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
21650 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
21660 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74  .  {.    char *t
21670 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74  estPath;.    int
21680 20 72 63 3b 0a 20 20 20 20 63 68 61 72 20 70 72   rc;.    char pr
21690 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20  oxyPath[400];.  
216a0 20 20 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f    .    if( sizeo
216b0 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77  f(proxyPath)<nPw
216c0 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63  d+20 ){.      Tc
216d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
216e0 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20  nterp, "PWD too 
216f0 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  big", (void*)0);
21700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
21710 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
21720 20 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79     sprintf(proxy
21730 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70  Path, "%s/test.p
21740 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20  roxy", zPwd);.  
21750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
21760 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
21770 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54  NULL, SQLITE_SET
21780 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
21790 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
217a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
217b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
217c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
217d0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
217e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
217f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
21800 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
21810 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
21820 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  LL, SQLITE_GET_L
21830 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74  OCKPROXYFILE, &t
21840 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66  estPath);.    if
21850 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50  ( strncmp(proxyP
21860 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29  ath,testPath,11)
21870 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
21880 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21890 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66  p, "Lock proxy f
218a0 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63  ile did not matc
218b0 68 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20  h the ".        
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73         "previous
218e0 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75  ly assigned valu
218f0 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
21900 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
21920 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
21930 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
21940 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
21950 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
21960 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21970 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
21980 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
21990 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
219a0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
219b0 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
219c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
219d0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
219e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
219f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
21a00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
21a10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
21a20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
21a30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
21a40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
21a50 3a 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  :   sqlite3_vfs_
21a60 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74  list.**.**   Ret
21a70 75 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63  urn a tcl list c
21a80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
21a90 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73  mes of all regis
21aa0 74 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a  tered vfs's..*/.
21ab0 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 6c  static int vfs_l
21ac0 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ist(.  ClientDat
21ad0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21ae0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21af0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21b00 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21b10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21b20 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21b30 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21b40 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21b50 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21b60 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21b70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21b80 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21b90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21ba0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21bb0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21bc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
21bd0 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  fs;.  Tcl_Obj *p
21be0 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
21bf0 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ();.  if( objc!=
21c00 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
21c10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
21c20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
21c30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
21c40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
21c50 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73  pVfs=sqlite3_vfs
21c60 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20  _find(0); pVfs; 
21c70 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74  pVfs=pVfs->pNext
21c80 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ){.    Tcl_ListO
21c90 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
21ca0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
21cb0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
21cc0 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29  Vfs->zName, -1))
21cd0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
21ce0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
21cf0 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e   pRet);.  return
21d00 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
21d10 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
21d20 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49  lite3_limit DB I
21d30 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68  D VALUE.**.** Th
21d40 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
21d50 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
21d60 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20  limit interface 
21d70 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
21d80 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
21d90 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n of the same..*
21da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
21db0 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e  t_limit(.  Clien
21dc0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
21dd0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
21de0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
21df0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
21e00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21e10 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
21e20 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
21e30 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
21e40 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
21e50 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
21e60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21e70 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
21e80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21e90 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
21ea0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
21eb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21ec0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  ;.  int rc;.  st
21ed0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
21ee0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
21ef0 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69  Name;.     int i
21f00 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b  d;.  } aId[] = {
21f10 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
21f20 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20  IMIT_LENGTH",   
21f30 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
21f40 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20  E_LIMIT_LENGTH  
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
21f60 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
21f70 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c  MIT_SQL_LENGTH",
21f80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21f90 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
21fa0 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  H           },. 
21fb0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
21fc0 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20  IT_COLUMN",     
21fd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21fe0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20  LIMIT_COLUMN    
21ff0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
22000 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
22010 54 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20  T_EXPR_DEPTH",  
22020 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
22030 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20  IMIT_EXPR_DEPTH 
22040 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
22050 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
22060 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
22070 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ",     SQLITE_LI
22080 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
22090 45 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ECT      },.    
220a0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
220b0 56 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20  VDBE_OP",       
220c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
220d0 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20  IT_VDBE_OP      
220e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
220f0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46   "SQLITE_LIMIT_F
22100 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20  UNCTION_ARG",   
22110 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
22120 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20  T_FUNCTION_ARG  
22130 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
22140 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  "SQLITE_LIMIT_AT
22150 54 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20  TACHED",        
22160 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
22170 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20  _ATTACHED       
22180 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
22190 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
221a0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
221b0 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ", SQLITE_LIMIT_
221c0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
221d0 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53  GTH  },.    { "S
221e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
221f0 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20  ABLE_NUMBER",   
22200 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
22210 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20  ARIABLE_NUMBER  
22220 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
22230 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
22240 45 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  ER_DEPTH",      
22250 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
22260 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20  IGGER_DEPTH     
22270 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f     },.    .    /
22280 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74  * Out of range t
22290 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20  est cases */.   
222a0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
222b0 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20  _TOOSMALL",     
222c0 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20         -1,      
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
222f0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
22300 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20  TOOBIG",        
22310 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
22320 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
22330 2b 31 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a  +1      },.  };.
22340 20 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69    int i, id;.  i
22350 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20  nt val;.  const 
22360 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66  char *zId;..  if
22370 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
22380 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22390 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
223a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
223b0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
223c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
223d0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
223e0 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55 45 22  , " DB ID VALUE"
223f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22400 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22410 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
22420 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
22430 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22440 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
22450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49   TCL_ERROR;.  zI
22460 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
22470 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
22480 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
22490 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b  aId)/sizeof(aId[
224a0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
224b0 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61  f( strcmp(zId, a
224c0 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  Id[i].zName)==0 
224d0 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49  ){.      id = aI
224e0 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62  d[i].id;.      b
224f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
22500 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
22510 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b  aId)/sizeof(aId[
22520 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  0]) ){.    Tcl_A
22530 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
22540 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d  rp, "unknown lim
22550 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c  it type: ", zId,
22560 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
22570 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
22590 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
225a0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
225b0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
225c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
225d0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
225e0 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63  , id, val);.  Tc
225f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
22600 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
22610 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  tObj(rc));.  ret
22620 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
22630 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
22640 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  save_prng_state.
22650 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73  **.** Save the s
22660 74 61 74 65 20 6f 66 20 74 68 65 20 70 73 65 75  tate of the pseu
22670 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  do-random number
22680 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41   generator..** A
22690 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
226a0 20 76 65 72 69 66 79 20 74 68 61 74 20 73 71 6c   verify that sql
226b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
226c0 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65  l works even whe
226d0 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  n.** called with
226e0 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65   an out-of-range
226f0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
22700 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67  ic int save_prng
22710 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
22720 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
22730 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
22740 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
22750 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
22760 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22770 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
22780 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
22790 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
227a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
227b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
227c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
227d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
227e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
227f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
22800 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
22810 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
22820 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
22830 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72  l(9999);.  asser
22840 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63  t( rc==0 );.  rc
22850 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
22860 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61  control(-1);.  a
22870 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
22880 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
22890 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
228a0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
228b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
228c0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
228d0 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e  md:  restore_prn
228e0 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
228f0 63 20 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72  c int restore_pr
22900 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
22910 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22920 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22930 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22940 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22950 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22960 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22970 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
22980 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
22990 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
229a0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
229b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
229c0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
229d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
229e0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
229f0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22a00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
22a10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
22a20 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
22a30 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75  RESTORE);.  retu
22a40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
22a50 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65  ** tclcmd:  rese
22a60 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  t_prng_state.*/.
22a70 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74  static int reset
22a80 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
22a90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
22aa0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
22ab0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
22ac0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
22ad0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
22ae0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
22af0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
22b00 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
22b10 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
22b20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
22b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22b40 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
22b50 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
22b60 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
22b70 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
22b80 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
22b90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
22ba0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
22bb0 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74  NG_RESET);.  ret
22bc0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22bd0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63  *.** tclcmd:  pc
22be0 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74  ache_stats.*/.st
22bf0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63  atic int test_pc
22c00 61 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c  ache_stats(.  Cl
22c10 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22c20 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
22c30 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22c40 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22c50 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22c60 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22c70 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22c80 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22c90 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22ca0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22cb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22cc0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22cd0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
22ce0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
22cf0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
22d00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e  */.){.  int nMin
22d10 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20  ;.  int nMax;.  
22d20 69 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20  int nCurrent;.  
22d30 69 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b  int nRecyclable;
22d40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
22d50 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ;..  sqlite3Pcac
22d60 68 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e  heStats(&nCurren
22d70 74 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c  t, &nMax, &nMin,
22d80 20 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a   &nRecyclable);.
22d90 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  .  pRet = Tcl_Ne
22da0 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69  wObj();.  Tcl_Li
22db0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
22dc0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
22dd0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
22de0 6a 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29  j("current", -1)
22df0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
22e00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
22e10 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
22e20 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65  NewIntObj(nCurre
22e30 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nt));.  Tcl_List
22e40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
22e50 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
22e60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
22e70 22 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "max", -1));.  T
22e80 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
22e90 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
22ea0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
22eb0 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63  Obj(nMax));.  Tc
22ec0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
22ed0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
22ee0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
22ef0 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29  ngObj("min", -1)
22f00 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
22f10 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
22f20 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
22f30 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29  NewIntObj(nMin))
22f40 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
22f50 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
22f60 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
22f70 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63  ewStringObj("rec
22f80 79 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  yclable", -1));.
22f90 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
22fa0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
22fb0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
22fc0 49 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62  IntObj(nRecyclab
22fd0 6c 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  le));..  Tcl_Set
22fe0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
22ff0 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
23000 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
23010 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
23020 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
23030 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
23040 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  t_unlock_notify_
23050 63 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20  cb(void **aArg, 
23060 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
23070 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b   ii;.  for(ii=0;
23080 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b   ii<nArg; ii++){
23090 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28  .    Tcl_EvalEx(
230a0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41  (Tcl_Interp *)aA
230b0 72 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f  rg[ii], "unlock_
230c0 6e 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c  notify", -1, TCL
230d0 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
230e0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
230f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
23100 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f  OCK_NOTIFY */../
23110 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
23120 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
23130 69 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66  ify db.*/.#ifdef
23140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
23150 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61  NLOCK_NOTIFY.sta
23160 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c  tic int test_unl
23170 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c  ock_notify(.  Cl
23180 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
23190 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
231a0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
231b0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
231c0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
231d0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
231e0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
231f0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
23200 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23210 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23220 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
23230 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
23240 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
23250 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
23260 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
23270 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
23280 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
23290 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
232a0 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
232b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
232c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
232d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
232e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
232f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
23300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
23310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23320 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c  rc = sqlite3_unl
23330 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74  ock_notify(db, t
23340 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
23350 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e  y_cb, (void *)in
23360 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74  terp);.  Tcl_Set
23370 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
23380 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
23390 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
233a0 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
233b0 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
233c0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
233d0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
233e0 70 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a  point db ?NAME?.
233f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
23400 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
23410 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23420 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
23430 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
23440 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23450 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23460 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23470 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23480 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
234a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
234b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
234c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
234d0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
234e0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
234f0 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
23500 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
23510 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
23520 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
23530 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23540 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23550 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e   1, objv, "DB ?N
23560 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  AME?");.    retu
23570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23580 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
23590 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
235a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
235b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
235c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
235d0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
235e0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
235f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
23600 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  (objv[2]);.  }. 
23610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61   rc = sqlite3_wa
23620 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
23630 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74   zDb);.  Tcl_Set
23640 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
23650 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
23660 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
23670 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
23680 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
23690 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c  clcmd:  test_sql
236a0 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54  ite3_log ?SCRIPT
236b0 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ?.*/.static stru
236c0 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b  ct LogCallback {
236d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70  .  Tcl_Interp *p
236e0 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  Interp;.  Tcl_Ob
236f0 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61  j *pObj;.} logca
23700 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b  llback = {0, 0};
23710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f  .static void xLo
23720 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  gcallback(void *
23730 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c  unused, int err,
23740 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
23750 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20  Tcl_Obj *pNew = 
23760 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
23770 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
23780 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  j);.  Tcl_IncrRe
23790 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20  fCount(pNew);.  
237a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
237b0 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20  dElement(.      
237c0 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
237d0 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
237e0 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 65  3TestErrorName(e
237f0 72 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20  rr), -1).  );.  
23800 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
23810 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77  dElement(0, pNew
23820 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
23830 62 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20  bj(zMsg, -1));. 
23840 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c   Tcl_EvalObjEx(l
23850 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
23860 72 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56  rp, pNew, TCL_EV
23870 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56  AL_GLOBAL|TCL_EV
23880 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
23890 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
238a0 4e 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  New);.}.static i
238b0 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  nt test_sqlite3_
238c0 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  log(.  ClientDat
238d0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  a clientData,.  
238e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
238f0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23900 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23910 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23920 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23930 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23940 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23950 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23960 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23970 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23980 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23990 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 29  {.  if( objc>2 )
239a0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
239b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
239c0 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22  , objv, "SCRIPT"
239d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
239e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
239f0 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  f( logcallback.p
23a00 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  Obj ){.    Tcl_D
23a10 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63  ecrRefCount(logc
23a20 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
23a30 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
23a40 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67  Obj = 0;.    log
23a50 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
23a60 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
23a70 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
23a80 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c 20 30  CONFIG_LOG, 0, 0
23a90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  );.  }.  if( obj
23aa0 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61  c>1 ){.    logca
23ab0 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62  llback.pObj = ob
23ac0 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49  jv[1];.    Tcl_I
23ad0 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63  ncrRefCount(logc
23ae0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
23af0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
23b00 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  Interp = interp;
23b10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
23b20 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
23b30 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62  G_LOG, xLogcallb
23b40 61 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  ack, 0);.  }.  r
23b50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
23b60 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f  ./*.**     tcl_o
23b70 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41  bjproc COMMANDNA
23b80 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a  ME ARGS....**.**
23b90 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61   Run a TCL comma
23ba0 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a  nd using its obj
23bb0 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20  Proc interface. 
23bc0 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
23bd0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e  if.** the comman
23be0 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
23bf0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
23c00 74 61 74 69 63 20 69 6e 74 20 72 75 6e 41 73 4f  tatic int runAsO
23c10 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a  bjProc(.  void *
23c20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
23c30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23c40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
23c50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
23c60 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
23c70 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
23c80 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
23c90 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
23ca0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
23cb0 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20   objv, "COMMAND 
23cc0 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
23cd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23ce0 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43  .  if( !Tcl_GetC
23cf0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
23d00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
23d10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49  (objv[1]), &cmdI
23d20 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
23d30 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23d40 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f  erp, "command no
23d50 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20  t found: ",.    
23d60 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
23d70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
23d80 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
23d90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23da0 20 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66    }.  if( cmdInf
23db0 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a  o.objProc==0 ){.
23dc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
23dd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
23de0 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a  mmand has no obj
23df0 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20  Proc: ",.       
23e00 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
23e10 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
23e20 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
23e30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23e40 0a 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66  .  return cmdInf
23e50 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66  o.objProc(cmdInf
23e60 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c  o.objClientData,
23e70 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c   interp, objc-1,
23e80 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 0a 2f 2a   objv+1);.}.../*
23e90 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d  .** Register com
23ea0 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54  mands with the T
23eb0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
23ec0 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  */.int Sqlitetes
23ed0 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
23ee0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65  rp *interp){.  e
23ef0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
23f00 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
23f10 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
23f20 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
23f30 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
23f40 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
23f50 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
23f60 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65   int sqlite3_ope
23f70 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20  n_file_count;.  
23f80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
23f90 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20  e3_sort_count;. 
23fa0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
23fb0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
23fc0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
23fd0 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28  UNIX && defined(
23fe0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
23ff0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
24000 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65  ING_STYLE.  exte
24010 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  rn int sqlite3_h
24020 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69  ostid_num;.#endi
24030 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  f.  extern int s
24040 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
24050 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ize;.  extern in
24060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  t sqlite3BtreeSh
24070 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 28  aredCacheReport(
24080 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20  void*,.         
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74   Tcl_Interp*,int
240c0 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29  ,Tcl_Obj*CONST*)
240d0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
240e0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
240f0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43  Name;.     Tcl_C
24100 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
24110 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20   } aCmd[] = {.  
24120 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c     { "db_enter",
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24150 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20  oc*)db_enter    
24160 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
24170 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c     { "db_leave",
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
241a0 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20  oc*)db_leave    
241b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
241c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
241d0 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
241e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
241f0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
24200 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20  ntf_int    },.  
24210 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
24220 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20  rintf_int64",   
24230 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24240 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
24250 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20  ntf_int64  },.  
24260 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
24270 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20  rintf_long",    
24280 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24290 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
242a0 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20  ntf_long   },.  
242b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
242c0 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20  rintf_str",     
242d0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
242e0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
242f0 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20  ntf_str    },.  
24300 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
24310 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
24320 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24330 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72  oc*)sqlite3_snpr
24340 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20  intf_str   },.  
24350 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
24360 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20  rintf_stronly", 
24370 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24380 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
24390 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20  ntf_stronly},.  
243a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
243b0 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20  rintf_double",  
243c0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
243d0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
243e0 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20  ntf_double },.  
243f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
24400 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20  rintf_scaled",  
24410 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24420 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
24430 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20  ntf_scaled },.  
24440 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
24450 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22  rintf_hexdouble"
24460 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ,   (Tcl_CmdProc
24470 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
24480 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20  f_hexdouble},.  
24490 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
244a0 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20  rintf_z_test",  
244b0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
244c0 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
244d0 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _z        },.   
244e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
244f0 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20  intf_n_test",   
24500 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
24510 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  c*)test_mprintf_
24520 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  n        },.    
24530 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
24540 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20  intf_int",      
24550 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
24560 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  *)test_snprintf_
24570 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  int     },.     
24580 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  { "sqlite3_last_
24590 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
245a0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
245b0 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64  )test_last_rowid
245c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
245d0 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70   "sqlite3_exec_p
245e0 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
245f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
24600 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66  test_exec_printf
24610 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
24620 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  "sqlite3_exec_he
24630 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
24640 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
24650 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20  est_exec_hex    
24660 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
24670 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20  sqlite3_exec",  
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
246a0 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20 20  st_exec         
246b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
246c0 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c  qlite3_exec_nr",
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
246e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
246f0 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20  t_exec_nr       
24700 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
24710 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
24720 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  BLE.     { "sqli
24730 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
24740 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c  intf",      (Tcl
24750 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67  _CmdProc*)test_g
24760 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20  et_table_printf 
24770 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
24780 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22   "sqlite3_close"
24790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247a0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
247b0 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
247c0 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e     },.     { 
247d0 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
247e0 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
247f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
24800 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
24810 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ion  },.     { "
24820 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
24830 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20  ggregate",      
24840 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
24850 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
24860 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ate },.     { "s
24870 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
24880 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28  est_function", (
24890 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
248a0 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20  t_register_func 
248b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
248c0 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20  lite_abort",    
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
248e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
248f0 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20  te_abort        
24900 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
24910 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20  ite_bind",      
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
24930 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
24940 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  bind            
24950 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61   },.     { "brea
24960 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  kpoint",        
24970 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
24980 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
24990 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20  reakpoint       
249a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
249b0 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20  e3_key",        
249c0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
249d0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65  CmdProc*)test_ke
249e0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  y              }
249f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
24a00 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20  3_rekey",       
24a10 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
24a20 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b  mdProc*)test_rek
24a30 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ey            },
24a40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
24a50 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20  set_magic",     
24a60 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
24a70 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65  dProc*)sqlite_se
24a80 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a  t_magic      },.
24a90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
24aa0 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20  interrupt",     
24ab0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
24ac0 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72  Proc*)test_inter
24ad0 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  rupt        },. 
24ae0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
24af0 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  lete_function", 
24b00 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
24b10 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63  roc*)delete_func
24b20 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20  tion       },.  
24b30 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
24b40 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20  ete_collation", 
24b50 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
24b60 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  oc*)delete_colla
24b70 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20  tion      },.   
24b80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
24b90 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20  _autocommit",   
24ba0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
24bb0 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  c*)get_autocommi
24bc0 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
24bd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61 63   { "sqlite3_stac
24be0 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20 20  k_used",        
24bf0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
24c00 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  *)test_stack_use
24c10 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
24c20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  { "sqlite3_busy_
24c30 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
24c40 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
24c50 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f  )test_busy_timeo
24c60 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ut     },.     {
24c70 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20   "printf",      
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
24ca0 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20  test_printf     
24cb0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
24cc0 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22  "sqlite3IoTrace"
24cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
24ce0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
24cf0 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20  t_io_trace      
24d00 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61     },.  };.  sta
24d10 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
24d20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
24d30 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
24d40 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20  oc *xProc;.     
24d50 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
24d60 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20  ;.  } aObjCmd[] 
24d70 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  = {.     { "sqli
24d80 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
24d90 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f  ointer",    get_
24da0 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20  sqlite_pointer, 
24db0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
24dc0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20  ite3_bind_int", 
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
24de0 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20  t_bind_int,     
24df0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
24e00 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
24e10 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74 65  lob",         te
24e20 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
24e30 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
24e40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
24e50 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  4",            t
24e60 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20  est_bind_int64, 
24e70 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
24e80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
24e90 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ble",           
24ea0 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  test_bind_double
24eb0 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
24ec0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75  "sqlite3_bind_nu
24ed0 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ll",            
24ee0 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20   test_bind_null 
24ef0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
24f00 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74   "sqlite3_bind_t
24f10 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ext",           
24f20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74    test_bind_text
24f30 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
24f40 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
24f50 74 65 78 74 31 36 22 2c 20 20 20 20 20 20 20 20  text16",        
24f60 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78     test_bind_tex
24f70 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  t16   ,0 },.    
24f80 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
24f90 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
24fa0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c      test_bind_bl
24fb0 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ob     ,0 },.   
24fc0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
24fd0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
24fe0 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  t",  test_bind_p
24ff0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20  arameter_count, 
25000 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
25010 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
25020 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74  er_name",   test
25030 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
25040 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20  name,  0},.     
25050 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
25060 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22  parameter_index"
25070 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  ,  test_bind_par
25080 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d  ameter_index, 0}
25090 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
250a0 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
250b0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
250c0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30  lear_bindings, 0
250d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
250e0 65 33 5f 73 6c 65 65 70 22 2c 20 20 20 20 20 20  e3_sleep",      
250f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
25100 73 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  sleep,          
25110 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
25120 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  te3_errcode",   
25130 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
25140 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20 2c  _errcode       ,
25150 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
25160 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
25170 72 63 6f 64 65 22 2c 20 20 20 20 20 20 74 65 73  rcode",      tes
25180 74 5f 65 78 5f 65 72 72 63 6f 64 65 20 20 20 20  t_ex_errcode    
25190 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
251a0 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20  lite3_errmsg",  
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
251c0 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20  st_errmsg       
251d0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
251e0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22  qlite3_errmsg16"
251f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
25200 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20  est_errmsg16    
25210 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
25220 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20  sqlite3_open",  
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20  test_open       
25250 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
25260 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22  "sqlite3_open16"
25270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25280 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20   test_open16    
25290 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
252a0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65   "sqlite3_comple
252b0 74 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  te16",          
252c0 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31    test_complete1
252d0 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20  6    ,0 },..    
252e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
252f0 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  are",           
25300 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
25310 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
25320 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
25330 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20  pare16",        
25340 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
25350 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e16     ,0 },.  
25360 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
25370 65 70 61 72 65 5f 76 32 22 2c 20 20 20 20 20 20  epare_v2",      
25380 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
25390 72 65 5f 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20  re_v2    ,0 },. 
253a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
253b0 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 22 2c  repare_tkt3134",
253c0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
253d0 61 72 65 5f 74 6b 74 33 31 33 34 2c 20 30 7d 2c  are_tkt3134, 0},
253e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
253f0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 22 2c 20  _prepare16_v2", 
25400 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
25410 65 70 61 72 65 31 36 5f 76 32 20 20 2c 30 20 7d  epare16_v2  ,0 }
25420 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
25430 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20  3_finalize",    
25440 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 66            test_f
25450 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20  inalize      ,0 
25460 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
25470 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 22 2c  e3_stmt_status",
25480 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
25490 73 74 6d 74 5f 73 74 61 74 75 73 20 20 20 2c 30  stmt_status   ,0
254a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
254b0 74 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20  te3_reset",     
254c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
254d0 5f 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c  _reset         ,
254e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
254f0 69 74 65 33 5f 65 78 70 69 72 65 64 22 2c 20 20  ite3_expired",  
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
25510 74 5f 65 78 70 69 72 65 64 20 20 20 20 20 20 20  t_expired       
25520 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
25530 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
25540 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 74 65  indings",     te
25550 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
25560 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
25570 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 22 2c  qlite3_changes",
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
25590 65 73 74 5f 63 68 61 6e 67 65 73 20 20 20 20 20  est_changes     
255a0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
255b0 73 71 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20  sqlite3_step",  
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 74 65 73 74 5f 73 74 65 70 20 20 20 20 20 20 20  test_step       
255e0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
255f0 22 73 71 6c 69 74 65 33 5f 73 71 6c 22 2c 20 20  "sqlite3_sql",  
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25610 20 74 65 73 74 5f 73 71 6c 20 20 20 20 20 20 20   test_sql       
25620 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
25630 20 22 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73   "sqlite3_next_s
25640 74 6d 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  tmt",           
25650 20 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74    test_next_stmt
25660 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20       ,0 },..    
25670 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65   { "sqlite3_rele
25680 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
25690 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65      test_release
256a0 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c  _memory,     0},
256b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
256c0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
256d0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 6f  ",       test_so
256e0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20  ft_heap_limit,  
256f0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
25700 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
25710 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74 65  anup",        te
25720 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  st_thread_cleanu
25730 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  p,     0},.     
25740 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  { "sqlite3_pager
25750 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20 20  _refcounts",    
25760 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65     test_pager_re
25770 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c 0a  fcounts,    0},.
25780 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
25790 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
257a0 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c 6f  ,        test_lo
257b0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
257c0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
257d0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
257e0 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 65  d_extension", te
257f0 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20  st_enable_load, 
25800 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
25810 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
25820 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
25830 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64  ", test_extended
25840 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20 30  _result_codes, 0
25850 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
25860 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  e3_limit",      
25870 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
25880 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  limit,          
25890 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20         0},..    
258a0 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74   { "save_prng_st
258b0 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
258c0 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74      save_prng_st
258d0 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  ate,    0 },.   
258e0 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70 72 6e    { "restore_prn
258f0 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
25900 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72 6e       restore_prn
25910 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20  g_state, 0 },.  
25920 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72 6e 67     { "reset_prng
25930 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
25940 20 20 20 20 20 20 72 65 73 65 74 5f 70 72 6e 67        reset_prng
25950 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20  _state,   0 },. 
25960 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72      { "tcl_objpr
25970 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
25980 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50         runAsObjP
25990 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  roc,       0 },.
259a0 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  .     /* sqlite3
259b0 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20  _column_*() API 
259c0 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
259d0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22  e3_column_count"
259e0 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
259f0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30  column_count  ,0
25a00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
25a10 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c  te3_data_count",
25a20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
25a30 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c  _data_count    ,
25a40 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
25a50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
25a60 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
25a70 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20  t_column_type   
25a80 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
25a90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
25aa0 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  b",           te
25ab0 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20  st_column_blob  
25ac0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
25ad0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
25ae0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74  uble",         t
25af0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
25b00 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e ,0 },.     { "
25b10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
25b20 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
25b30 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
25b40 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  4  ,0 },.     { 
25b50 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
25b60 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74  text",   test_st
25b70 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
25b80 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
25b90 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22  text },.     { "
25ba0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
25bb0 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ame",   test_stm
25bc0 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
25bd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
25be0 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ame },.     { "s
25bf0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
25c00 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74  t",    test_stmt
25c10 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
25c20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
25c30 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t  },.     { "sq
25c40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
25c50 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  es",  test_stmt_
25c60 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
25c70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
25c80 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es},.#ifndef SQL
25c90 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
25ca0 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
25cb0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
25cc0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
25cd0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
25ce0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
25cf0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
25d00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
25d10 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
25d20 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
25d30 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c  _database_name",
25d40 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
25d50 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
25d60 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
25d70 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
25d80 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
25d90 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
25da0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
25db0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
25dc0 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
25dd0 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
25de0 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
25df0 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
25e00 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
25e10 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23  name},.#endif..#
25e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25e30 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
25e40 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
25e50 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73  bytes16", test_s
25e60 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29  tmt_int, (void*)
25e70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
25e80 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b  ytes16 },.     {
25e90 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
25ea0 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f  _text16",  test_
25eb0 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
25ec0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
25ed0 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20  n_text16},.     
25ee0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
25ef0 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74  n_name16",  test
25f00 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
25f10 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
25f20 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20  mn_name16},.    
25f30 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e   { "add_alignmen
25f40 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
25f50 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  s", add_alignmen
25f60 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
25f70 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66  s, 0      },.#if
25f80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25f90 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
25fa0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
25fb0 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73  _decltype16",tes
25fc0 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f  t_stmt_utf16,(vo
25fd0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
25fe0 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a  mn_decltype16},.
25ff0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
26000 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
26010 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71  MN_METADATA.{"sq
26020 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
26030 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20  abase_name16",. 
26040 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
26050 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
26060 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
26070 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  },.{"sqlite3_col
26080 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36  umn_table_name16
26090 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
260a0 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
260b0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
260c0 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
260d0 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
260e0 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
260f0 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
26100 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
26110 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c  _origin_name16},
26120 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
26130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
26140 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
26150 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
26160 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30  _collation_v2, 0
26170 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
26180 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
26190 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c  er",     test_gl
261a0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20  obal_recover, 0 
261b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72    },.     { "wor
261c0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c  king_64bit_int",
261d0 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e            workin
261e0 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30  g_64bit_int,   0
261f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
26200 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20  s_unlink_test", 
26210 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 75             vfs_u
26220 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20  nlink_test,     
26230 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
26240 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
26250 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73 5f  ",          vfs_
26260 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20 20  initfail_test,  
26270 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
26280 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
26290 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66 73  ll",         vfs
262a0 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c  _unregister_all,
262b0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
262c0 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f  "vfs_reregister_
262d0 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
262e0 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
262f0 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
26300 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
26310 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 66  est",          f
26320 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
26330 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
26340 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
26350 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c  lasterrno_test",
26360 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
26370 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30  sterrno_test,  0
26380 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
26390 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
263a0 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69 6c 65  roxy_test", file
263b0 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
263c0 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  xy_test,  0   },
263d0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
263e0 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
263f0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
26400 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
26410 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
26420 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f   { "sqlite3_vfs_
26430 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  list",          
26440 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30   vfs_list,     0
26450 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
26460 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
26470 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ction_v2", test_
26480 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
26490 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f  v2, 0 },..     /
264a0 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d  * Functions from
264b0 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66   os.h */.#ifndef
264c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
264d0 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  16.     { "add_t
264e0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20  est_collate",   
264f0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74       test_collat
26500 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  e, 0            
26510 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
26520 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
26530 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ed", test_collat
26540 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20 20  e_needed, 0     
26550 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
26560 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  est_function",  
26570 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69       test_functi
26580 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  on, 0           
26590 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
265a0 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65   "sqlite3_test_e
265b0 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73 74  rrstr",     test
265c0 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20 20  _errstr, 0      
265d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
265e0 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74   "tcl_variable_t
265f0 79 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f  ype",       tcl_
26600 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30  variable_type, 0
26610 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65         },.#ifnde
26620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
26630 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
26640 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  { "sqlite3_enabl
26650 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c  e_shared_cache",
26660 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
26670 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  red, 0  },.     
26680 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65  { "sqlite3_share
26690 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c  d_cache_report",
266a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
266b0 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20  redCacheReport, 
266c0 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0},.#endif.     
266d0 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  { "sqlite3_libve
266e0 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74  rsion_number", t
266f0 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  est_libversion_n
26700 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66  umber, 0  },.#if
26710 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
26720 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
26730 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  A.     { "sqlite
26740 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
26750 65 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74  etadata", test_t
26760 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
26770 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  data, 0  },.#end
26780 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
26790 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
267a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
267b0 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 74 65 73  blob_read",  tes
267c0 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30 20 20  t_blob_read, 0  
267d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
267e0 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22 2c 20  e3_blob_write", 
267f0 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65 2c  test_blob_write,
26800 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
26810 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74 61     { "pcache_sta
26820 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
26830 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30 20  pcache_stats, 0 
26840 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
26850 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
26860 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22 73  NOTIFY.     { "s
26870 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f  qlite3_unlock_no
26880 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c 6f  tify", test_unlo
26890 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d 2c  ck_notify, 0  },
268a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
268b0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
268c0 6b 70 6f 69 6e 74 22 2c 20 74 65 73 74 5f 77 61  kpoint", test_wa
268d0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20  l_checkpoint, 0 
268e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74   },.     { "test
268f0 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20  _sqlite3_log",  
26900 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f     test_sqlite3_
26910 6c 6f 67 2c 20 30 20 20 7d 2c 0a 20 20 7d 3b 0a  log, 0  },.  };.
26920 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74    static int bit
26930 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65  mask_size = size
26940 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20  of(Bitmask)*8;. 
26950 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e   int i;.  extern
26960 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e   int sqlite3_syn
26970 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33  c_count, sqlite3
26980 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b  _fullsync_count;
26990 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
269a0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
269b0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
269c0 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  nt sqlite3_like_
269d0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
269e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72  int sqlite3_xfer
269f0 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  opt_count;.  ext
26a00 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
26a10 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
26a20 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
26a30 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
26a40 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  ritedb_count;.  
26a50 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
26a60 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
26a70 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54  count;.#if SQLIT
26a80 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72  E_OS_WIN.  exter
26a90 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  n int sqlite3_os
26aa0 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69  _type;.#endif.#i
26ab0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26ac0 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  G.  extern int s
26ad0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
26ae0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
26af0 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20  qlite3OSTrace;. 
26b00 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
26b10 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
26b20 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
26b30 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 3b  sqlite3WalTrace;
26b40 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
26b50 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74  QLITE_TEST.  ext
26b60 65 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33  ern char sqlite3
26b70 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20  _query_plan[];. 
26b80 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 71 75   static char *qu
26b90 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74  ery_plan = sqlit
26ba0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23  e3_query_plan;.#
26bb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26bc0 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72  BLE_FTS3.  exter
26bd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  n int sqlite3_ft
26be0 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
26bf0 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65  heses;.#endif.#e
26c00 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ndif..  for(i=0;
26c10 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f   i<sizeof(aCmd)/
26c20 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b  sizeof(aCmd[0]);
26c30 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
26c40 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
26c50 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61  erp, aCmd[i].zNa
26c60 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f  me, aCmd[i].xPro
26c70 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
26c80 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
26c90 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
26ca0 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
26cb0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
26cc0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
26cd0 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
26ce0 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
26cf0 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f   aObjCmd[i].xPro
26d00 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c  c, aObjCmd[i].cl
26d10 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  ientData, 0);.  
26d20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  }.  Tcl_LinkVar(
26d30 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
26d40 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a  search_count", .
26d50 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
26d60 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
26d70 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
26d80 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
26d90 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
26da0 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a  _found_count", .
26db0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
26dc0 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
26dd0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
26de0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
26df0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
26e00 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  sort_count", .  
26e10 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
26e20 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20  te3_sort_count, 
26e30 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
26e40 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
26e50 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61  erp, "sqlite3_ma
26e60 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20  x_blobsize", .  
26e70 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
26e80 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
26e90 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
26ea0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
26eb0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
26ec0 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ike_count", .   
26ed0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
26ee0 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54  e3_like_count, T
26ef0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
26f00 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
26f10 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
26f20 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
26f30 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
26f40 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
26f50 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
26f60 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
26f70 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
26f80 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
26f90 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
26fa0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
26fb0 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
26fc0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
26fd0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
26fe0 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
26ff0 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
27000 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
27010 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
27020 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
27030 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
27040 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
27050 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
27060 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
27070 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TYLE.  Tcl_LinkV
27080 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
27090 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20  te_hostid_num", 
270a0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
270b0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
270c0 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  m, TCL_LINK_INT)
270d0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
270e0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
270f0 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
27100 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
27110 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66  har*)&sqlite3_xf
27120 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  eropt_count, TCL
27130 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
27140 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
27150 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
27160 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a  _readdb_count",.
27170 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
27180 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
27190 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
271a0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
271b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
271c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
271d0 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  itedb_count",.  
271e0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
271f0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
27200 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
27210 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
27220 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
27230 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
27240 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  tej_count",.    
27250 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
27260 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
27270 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
27280 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
27290 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
272a0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
272b0 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
272c0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
272d0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
272e0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
272f0 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
27300 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
27310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27320 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
27330 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
27340 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
27350 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
27360 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
27370 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
27380 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
27390 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
273a0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
273b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
273c0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
273d0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
273e0 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
273f0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
27400 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ype, TCL_LINK_IN
27410 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
27420 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
27430 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
27440 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72  rp, "sqlite_quer
27450 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28  y_plan",.      (
27460 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61  char*)&query_pla
27470 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
27480 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
27490 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
274a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
274b0 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
274c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
274d0 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20  _addop_trace",. 
274e0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
274f0 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
27500 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
27510 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
27520 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
27530 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
27540 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
27550 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
27560 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
27570 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
27580 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
27590 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
275a0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
275b0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
275c0 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
275d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54  ITE_OMIT_WAL.  T
275e0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
275f0 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74  p, "sqlite_wal_t
27600 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
27610 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54  ar*)&sqlite3WalT
27620 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
27630 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  NT);.#endif.#end
27640 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
27650 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
27660 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
27670 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
27680 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
27690 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
276a0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
276b0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
276c0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
276d0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
276e0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
276f0 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
27700 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
27710 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
27720 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
27730 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
27740 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
27750 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
27760 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
27770 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
27780 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
27790 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
277a0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
277b0 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
277c0 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
277d0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
277e0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
277f0 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
27800 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
27810 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74 6d  ar(interp, "bitm
27820 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20  ask_size",.     
27830 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73 6b   (char*)&bitmask
27840 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _size, TCL_LINK_
27850 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  INT|TCL_LINK_REA
27860 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c  D_ONLY);.  Tcl_L
27870 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
27880 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
27890 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
278a0 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  )&sqlite3_sync_c
278b0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
278c0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
278d0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
278e0 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  te_fullsync_coun
278f0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
27900 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  )&sqlite3_fullsy
27910 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nc_count, TCL_LI
27920 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65 66  NK_INT);.#if def
27930 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
27940 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66 69  LE_FTS3) && defi
27950 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
27960 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
27970 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66  nterp, "sqlite_f
27980 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
27990 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20 28  theses",.      (
279a0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
279b0 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
279c0 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b  theses, TCL_LINK
279d0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
279e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
279f0 0a                                               .