/ Hex Artifact Content
Login

Artifact 397809a3069c171a507a49b6f6edfc4255b0afbc:


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 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61   sqlite3Atoi64(a
9200: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c  rgv[i], &a[i-2],
9210: 20 31 30 30 30 30 30 30 2c 20 53 51 4c 49 54 45   1000000, SQLITE
9220: 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20  _UTF8) ){.      
9230: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9240: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65  (interp, "argume
9250: 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  nt is not a vali
9260: 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  d 64-bit integer
9270: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
9280: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9290: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73     }.  }.  z = s
92a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
92b0: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
92c0: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
92d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
92e0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
92f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
9300: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
9320: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9330: 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e  f_long FORMAT IN
9340: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e  TEGER INTEGER IN
9350: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TEGER.**.** Call
9360: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68   mprintf with th
9370: 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72  ree long integer
9380: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68   arguments.   Th
9390: 69 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a  is might be the.
93a0: 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  ** same as sqlit
93b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f  e3_mprintf_int o
93c0: 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  r sqlite3_mprint
93d0: 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69  f_int64, dependi
93e0: 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72  ng on.** platfor
93f0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
9400: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9410: 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e  _long(.  void *N
9420: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9430: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9440: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9450: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9460: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9470: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9490: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
94a0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
94b0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
94c0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
94d0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
94e0: 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20    int i;.  long 
94f0: 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20  int a[3];.  int 
9500: 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  b[3];.  char *z;
9510: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
9520: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9540: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9550: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
9560: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
9570: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
9580: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
9590: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
95a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
95b0: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
95c0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
95d0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62  erp, argv[i], &b
95e0: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
95f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61  TCL_ERROR;.    a
9600: 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e  [i-2] = (long in
9610: 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b  t)b[i-2];.    a[
9620: 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34 29 31  i-2] &= (((u64)1
9630: 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a  )<<(sizeof(int)*
9640: 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d  8))-1;.  }.  z =
9650: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9660: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
9670: 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54  a[1], a[2]);.  T
9680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9690: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
96a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
96b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
96c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
96d0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
96e0: 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 49  ntf_str FORMAT I
96f0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53  NTEGER INTEGER S
9700: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
9710: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
9720: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
9730: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69  nts and one stri
9740: 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  ng argument.*/.s
9750: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9760: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20  3_mprintf_str(. 
9770: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9780: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9790: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
97a0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
97b0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
97c0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
97d0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
97e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
97f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9800: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9820: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9830: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9840: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
9850: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c  ;.  if( argc<4 |
9860: 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20  | argc>5 ){.    
9870: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9880: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9890: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
98a0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
98b0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
98c0: 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f  INT INT ?STRING?
98d0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
98e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
98f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
9900: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
9910: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9920: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
9930: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
9940: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9950: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9960: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9970: 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20  ], a[1], argc>4 
9980: 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c  ? argv[4] : NULL
9990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
99a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
99b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
99c0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
99d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
99e0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
99f0: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 49  3_snprintf_str I
9a00: 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49 4e  NTEGER FORMAT IN
9a10: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54  TEGER INTEGER ST
9a20: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
9a30: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f  mprintf with two
9a40: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
9a50: 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e  ts and one strin
9a60: 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74  g argument.*/.st
9a70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9a80: 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a 20  _snprintf_str(. 
9a90: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9aa0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9ab0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9ac0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9ad0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9ae0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9af0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9b00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9b10: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9b20: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9b40: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9b50: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9b60: 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a  3], i;.  int n;.
9b70: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9b80: 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63 3e   argc<5 || argc>
9b90: 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  6 ){.    Tcl_App
9ba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9bb0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9bc0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9bd0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9be0: 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e 54  " INT FORMAT INT
9bf0: 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22   INT ?STRING?\""
9c00: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9c10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9c20: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9c30: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
9c40: 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
9c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
9c60: 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  n<0 ){.    Tcl_A
9c70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9c80: 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20 6e  rp, "N must be n
9c90: 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30 29  on-negative", 0)
9ca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9cb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9cc0: 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=3; i<5; i++)
9cd0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
9ce0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
9cf0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20 29  v[i], &a[i-3]) )
9d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9d10: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
9d20: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31  ite3_malloc( n+1
9d30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   );.  sqlite3_sn
9d40: 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72 67  printf(n, z, arg
9d50: 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[2], a[0], a[1]
9d60: 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b  , argc>4 ? argv[
9d70: 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63  5] : NULL);.  Tc
9d80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9d90: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9da0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9db0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9dd0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9de0: 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54  tf_double FORMAT
9df0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9e00: 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61   DOUBLE.**.** Ca
9e10: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9e20: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9e30: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f  ments and one do
9e40: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  uble argument.*/
9e50: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9e60: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9e70: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
9e80: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9e90: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9ea0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9eb0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9ec0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9ed0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ef0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9f00: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9f10: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9f20: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9f30: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9f40: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f  nt a[3], i;.  do
9f50: 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a  uble r;.  char *
9f60: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9f70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9f80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9f90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9fa0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9fb0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
9fc0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
9fd0: 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20  DOUBLE\"", 0);. 
9fe0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9ff0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
a000: 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =2; i<4; i++){. 
a010: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
a020: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
a030: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
a040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a050: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
a060: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20  tDouble(interp, 
a070: 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72  argv[4], &r) ) r
a080: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a090: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
a0a0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
a0b0: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a  a[0], a[1], r);.
a0c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a0d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a0f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a100: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a110: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a120: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46 4f  printf_scaled FO
a130: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
a140: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
a150: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a160: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a170: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
a180: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
a190: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
a1a0: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
a1b0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
a1c0: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
a1d0: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
a1e0: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
a1f0: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
a200: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
a210: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
a220: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
a230: 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69 64  f_scaled(.  void
a240: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
a250: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a260: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a270: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a280: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a290: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
a2a0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
a2b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a2c0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a2d0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a2e0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a2f0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a300: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f  ){.  int i;.  do
a310: 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61  uble r[2];.  cha
a320: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
a330: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
a340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a350: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
a360: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
a370: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
a380: 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c    " FORMAT DOUBL
a390: 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b  E DOUBLE\"", 0);
a3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a3b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
a3c0: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
a3d0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
a3e0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
a3f0: 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29  rgv[i], &r[i-2])
a400: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a410: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
a420: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
a430: 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31  rgv[1], r[0]*r[1
a440: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
a450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a460: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a470: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a480: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a490: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
a4a0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
a4b0: 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47  ly FORMAT STRING
a4c0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
a4d0: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
a4e0: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
a4f0: 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  t which is the p
a500: 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a  roduct of the.**
a510: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67   two arguments g
a520: 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69  iven above.  Thi
a530: 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e  s is used to gen
a540: 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61  erate overflow a
a550: 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20  nd underflow.** 
a560: 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20  doubles to test 
a570: 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6f  that they are co
a580: 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79  nverted properly
a590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a5a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a5b0: 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  stronly(.  void 
a5c0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
a5d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a5e0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a5f0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a600: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a610: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
a620: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a640: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
a650: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
a660: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
a670: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
a680: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
a690: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
a6a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a6b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a6c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a6d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
a6e0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
a6f0: 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b  T STRING\"", 0);
a700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
a720: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a730: 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32  (argv[1], argv[2
a740: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
a750: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a760: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a770: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a780: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a790: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
a7a0: 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
a7b0: 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58 0a  uble FORMAT HEX.
a7c0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
a7d0: 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  tf with a single
a7e0: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
a7f0: 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65   which is derive
a800: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68 65  d from the.** he
a810: 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69  xadecimal encodi
a820: 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64 6f  ng of an IEEE do
a830: 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
a840: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
a850: 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a 20  ntf_hexdouble(. 
a860: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a870: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a880: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a890: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a8a0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a8b0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a8c0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a8d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a8e0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a8f0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a910: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a920: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
a930: 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  z;.  double r;. 
a940: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 31   unsigned int x1
a950: 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f 75  , x2;.  sqlite_u
a960: 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20 61  int64 d;.  if( a
a970: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a980: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a990: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a9a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a9b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a9c0: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a9d0: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a9e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a9f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63  R;.  }.  if( ssc
aa00: 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30  anf(argv[2], "%0
aa10: 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78  8x%08x", &x2, &x
aa20: 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=2 ){.    Tcl
aa30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
aa40: 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d  terp, "2nd argum
aa50: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36  ent should be 16
aa60: 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 68  -characters of h
aa70: 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ex", 0);.    ret
aa80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aa90: 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64   }.  d = x2;.  d
aaa0: 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b   = (d<<32) + x1;
aab0: 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64  .  memcpy(&r, &d
aac0: 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  , sizeof(r));.  
aad0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
aae0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b  ntf(argv[1], r);
aaf0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
ab00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
ab10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
ab20: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
ab30: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ab40: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
ab50: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
ab60: 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  he ?BOOLEAN?.**.
ab70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
ab80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ab90: 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69 63  ED_CACHE).static
aba0: 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65   int test_enable
abb0: 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e  _shared(.  Clien
abc0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
abd0: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
abe0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
abf0: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
ac00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ac10: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
ac20: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
ac30: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
ac40: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
ac50: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
ac60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ac70: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
ac80: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
ac90: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
aca0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
acb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
acc0: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74  nt enable;.  int
acd0: 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28   ret = 0;..  if(
ace0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
acf0: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
ad00: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ad10: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42  rp, 1, objv, "?B
ad20: 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72  OOLEAN?");.    r
ad30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ad40: 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c  .  }.  ret = sql
ad50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
ad60: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
ad70: 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  led;..  if( objc
ad80: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
ad90: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
ada0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
adb0: 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29  v[1], &enable) )
adc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
add0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ade0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
adf0: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
ae00: 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20  ache(enable);.  
ae10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ae20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
ae30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ae40: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
ae50: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43  e3ErrStr(rc), TC
ae60: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  L_STATIC);.     
ae70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ae80: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  R;.    }.  }.  T
ae90: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
aea0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
aeb0: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b  ooleanObj(ret));
aec0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
aed0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  ;.}.#endif..../*
aee0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
aef0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
af00: 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20  lt_codes   DB   
af10: 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73   BOOLEAN.**.*/.s
af20: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
af30: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
af40: 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  odes(.  ClientDa
af50: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
af60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
af70: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
af80: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
af90: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
afa0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
afb0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
afc0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
afd0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
afe0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
aff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b000: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b010: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b020: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b030: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b040: 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20    int enable;.  
b050: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
b060: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
b070: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b080: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b090: 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e  bjv, "DB BOOLEAN
b0a0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b0b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b0c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b0d0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b0e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b0f0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b100: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
b110: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
b120: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
b130: 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20  jv[2], &enable) 
b140: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b150: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  OR;.  sqlite3_ex
b160: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
b170: 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b  des(db, enable);
b180: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b1a0: 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  : sqlite3_libver
b1b0: 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a  sion_number.**.*
b1c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
b1d0: 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  t_libversion_num
b1e0: 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ber(.  ClientDat
b1f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
b200: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
b210: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
b220: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
b230: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b240: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b250: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b260: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b270: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b280: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b290: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b2a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b2b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b2c0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b2d0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b2e0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b2f0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b300: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
b310: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
b320: 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  r()));.  return 
b330: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b340: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b350: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
b360: 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65 20  adata DB dbname 
b370: 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a  tblname colname.
b380: 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  **.*/.#ifdef SQL
b390: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b3a0: 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61 74 69  N_METADATA.stati
b3b0: 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65  c int test_table
b3c0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b3d0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b3e0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
b3f0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
b400: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
b410: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
b420: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
b430: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
b440: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
b450: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
b460: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b480: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b490: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
b4a0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
b4b0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
b4c0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
b4d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
b4e0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
b4f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
b500: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b510: 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zCol;.  int rc;.
b520: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
b530: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
b540: 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e  zDatatype;.  con
b550: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65  st char *zCollse
b560: 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  q;.  int notnull
b570: 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
b580: 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e  ey;.  int autoin
b590: 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20  crement;..  if( 
b5a0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
b5b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
b5c0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
b5d0: 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e   "DB dbname tbln
b5e0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20  ame colname");. 
b5f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b600: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
b610: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
b620: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b630: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
b640: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b650: 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c  ROR;.  zDb = Tcl
b660: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b670: 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63  2]);.  zTbl = Tc
b680: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b690: 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54  [3]);.  zCol = T
b6a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b6b0: 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73 74  v[4]);..  if( st
b6c0: 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a  rlen(zDb)==0 ) z
b6d0: 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  Db = 0;..  rc = 
b6e0: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
b6f0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62  lumn_metadata(db
b700: 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f  , zDb, zTbl, zCo
b710: 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74 61  l, .      &zData
b720: 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c  type, &zCollseq,
b730: 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d   &notnull, &prim
b740: 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63  arykey, &autoinc
b750: 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20  rement);..  if( 
b760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b770: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b780: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
b790: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
b7a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
b7b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b7c0: 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  .  pRet = Tcl_Ne
b7d0: 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69  wObj();.  Tcl_Li
b7e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b7f0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b800: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61  NewStringObj(zDa
b810: 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20  tatype, -1));.  
b820: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b830: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b840: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b850: 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29  bj(zCollseq, -1)
b860: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b870: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b880: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
b890: 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a  tObj(notnull));.
b8a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b8b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b8c0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b8d0: 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a  j(primarykey));.
b8e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b8f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b900: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b910: 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  j(autoincrement)
b920: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
b930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
b940: 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
b950: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
b960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b970: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73  OMIT_INCRBLOB..s
b980: 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61  tatic int blobHa
b990: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54  ndleFromObj(.  T
b9a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b9b0: 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  p, .  Tcl_Obj *p
b9c0: 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  Obj,.  sqlite3_b
b9d0: 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a  lob **ppBlob.){.
b9e0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
b9f0: 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47   n;..  z = Tcl_G
ba00: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
ba10: 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28  pObj, &n);.  if(
ba20: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70   n==0 ){.    *pp
ba30: 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Blob = 0;.  }els
ba40: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  e{.    int notUs
ba50: 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ed;.    Tcl_Chan
ba60: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20  nel channel;.   
ba70: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
ba80: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20  anceData;.    . 
ba90: 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c     channel = Tcl
baa0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
bab0: 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29  rp, z, &notUsed)
bac0: 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e  ;.    if( !chann
bad0: 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  el ) return TCL_
bae0: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f  ERROR;..    Tcl_
baf0: 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a  Flush(channel);.
bb00: 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61      Tcl_Seek(cha
bb10: 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45  nnel, 0, SEEK_SE
bb20: 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63  T);..    instanc
bb30: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
bb40: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
bb50: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20  ta(channel);.   
bb60: 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71   *ppBlob = *((sq
bb70: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
bb80: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d  stanceData);.  }
bb90: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
bba0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  K;.}../*.** sqli
bbb0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 20 20  te3_blob_bytes  
bbc0: 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69  CHANNEL.*/.stati
bbd0: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
bbe0: 62 79 74 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  bytes(.  ClientD
bbf0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
bc00: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
bc10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bc20: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
bc30: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
bc40: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
bc50: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
bc60: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
bc70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bc80: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
bc90: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
bca0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
bcb0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
bcc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ){.  sqlite3_blo
bcd0: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
bce0: 6e 42 79 74 65 3b 0a 20 20 0a 20 20 69 66 28 20  nByte;.  .  if( 
bcf0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
bd00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
bd10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
bd20: 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20   "CHANNEL");.   
bd30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bd40: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
bd50: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
bd60: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
bd70: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
bd80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 6e  n TCL_ERROR;.  n
bd90: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
bda0: 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62 29  lob_bytes(pBlob)
bdb0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
bdc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
bdd0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65  _NewIntObj(nByte
bde0: 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  ));..  return TC
bdf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73  L_OK;.}../*.** s
be00: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
be10: 65 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74  e  CHANNEL.*/.st
be20: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c  atic int test_bl
be30: 6f 62 5f 63 6c 6f 73 65 28 0a 20 20 43 6c 69 65  ob_close(.  Clie
be40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
be50: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
be60: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
be70: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
be80: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
be90: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
bea0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
beb0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
bec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bed0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
bee0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
bef0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
bf00: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
bf10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
bf20: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 0a  blob *pBlob;.  .
bf30: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
bf40: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
bf50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
bf60: 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 22   objv, "CHANNEL"
bf70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
bf80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
bf90: 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  if( blobHandleFr
bfa0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
bfb0: 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29  jv[1], &pBlob) )
bfc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bfd0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  R;.  sqlite3_blo
bfe0: 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
bff0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
c010: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43 48  e3_blob_read  CH
c020: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a 2a  ANNEL OFFSET N.*
c030: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d  *.**   This comm
c040: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
c050: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
c060: 62 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20 77  blob_read() in w
c070: 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68  ays that.**   th
c080: 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e  e Tcl channel in
c090: 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74  terface does not
c0a0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
c0b0: 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20  ment should.**  
c0c0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
c0d0: 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20  a valid channel 
c0e0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b  created by the [
c0f0: 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64  incrblob] method
c100: 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62  .**   of a datab
c110: 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  ase handle. This
c120: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
c130: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
c140: 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61 64  d().**   to read
c150: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66   N bytes from of
c160: 66 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f 6d  fset OFFSET from
c170: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c180: 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f 62  SQLite.**   blob
c190: 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20   handle..**.**  
c1a0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 62   On success, a b
c1b0: 79 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63 74  yte-array object
c1c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c1d0: 72 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a 2a  read data is .**
c1e0: 20 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20     returned. On 
c1f0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74  failure, the int
c200: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20  erpreter result 
c210: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
c220: 20 20 20 74 65 78 74 20 72 65 70 72 65 73 65 6e     text represen
c230: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  tation of the re
c240: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64  turned error cod
c250: 65 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f  e (i.e. "SQLITE_
c260: 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e 64  NOMEM").**   and
c270: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
c280: 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73   is thrown..*/.s
c290: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
c2a0: 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69 65  lob_read(.  Clie
c2b0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c2c0: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
c2d0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c2e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c2f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c300: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c310: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c320: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c330: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c340: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c350: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c360: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c370: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c380: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
c390: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69  blob *pBlob;.  i
c3a0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
c3b0: 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  iOffset;.  unsig
c3c0: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 20 3d  ned char *zBuf =
c3d0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
c3e0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
c3f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
c400: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c410: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
c420: 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20 20   OFFSET N");.   
c430: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c440: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
c450: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
c460: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
c470: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
c480: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
c490: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
c4a0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c4b0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
c4c0: 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54 43  Offset).   || TC
c4d0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
c4e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
c4f0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65 29  objv[3], &nByte)
c500: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
c510: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c520: 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 30 20  ..  if( nByte>0 
c530: 29 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 28 75  ){.    zBuf = (u
c540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
c550: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
c560: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c570: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 42  te3_blob_read(pB
c580: 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74 65  lob, zBuf, nByte
c590: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66  , iOffset);.  if
c5a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c5b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
c5c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c5d0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
c5e0: 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65 29  Obj(zBuf, nByte)
c5f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c600: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c610: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
c620: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
c630: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41  me(rc), TCL_VOLA
c640: 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  TILE);.  }.  Tcl
c650: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 7a 42  _Free((char *)zB
c660: 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  uf);..  return (
c670: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
c680: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
c690: 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  OR);.}../*.** sq
c6a0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
c6b0: 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20   CHANNEL OFFSET 
c6c0: 44 41 54 41 20 3f 4e 44 41 54 41 3f 0a 2a 2a 0a  DATA ?NDATA?.**.
c6d0: 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  **   This comman
c6e0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
c6f0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  t the sqlite3_bl
c700: 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20 77 61  ob_write() in wa
c710: 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65  ys that.**   the
c720: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74   Tcl channel int
c730: 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e  erface does not.
c740: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
c750: 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20  ent should.**   
c760: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
c770: 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63   valid channel c
c780: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69  reated by the [i
c790: 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a  ncrblob] method.
c7a0: 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61  **   of a databa
c7b0: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
c7c0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
c7d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
c7e0: 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  e().**   to writ
c7f0: 65 20 74 68 65 20 44 41 54 41 20 62 79 74 65 2d  e the DATA byte-
c800: 61 72 72 61 79 20 74 6f 20 74 68 65 20 75 6e 64  array to the und
c810: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 62  erlying SQLite b
c820: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20  lob handle..**  
c830: 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46 53 45   at offset OFFSE
c840: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  T..**.**   On su
c850: 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74 79 20  ccess, an empty 
c860: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
c870: 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  ed. On failure, 
c880: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0a  the interpreter.
c890: 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73 20 73  **   result is s
c8a0: 65 74 20 74 6f 20 74 68 65 20 74 65 78 74 20 72  et to the text r
c8b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
c8c0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65 72   the returned er
c8d0: 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28  ror code .**   (
c8e0: 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  i.e. "SQLITE_NOM
c8f0: 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c 20 65  EM") and a Tcl e
c900: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
c910: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
c920: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74  t test_blob_writ
c930: 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
c940: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
c950: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
c960: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c970: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
c980: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
c990: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
c9a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
c9b0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
c9c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
c9d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
c9e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c9f0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ca00: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
ca10: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
ca20: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Blob;.  int iOff
ca30: 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  set;.  int rc;..
ca40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
ca50: 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75  *zBuf;.  int nBu
ca60: 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  f;.  .  if( objc
ca70: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35 20 29  !=4 && objc!=5 )
ca80: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ca90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
caa0: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
cab0: 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f 4e 44   OFFSET DATA ?ND
cac0: 41 54 41 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ATA?");.    retu
cad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cae0: 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e  }..  if( blobHan
caf0: 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dleFromObj(inter
cb00: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c  p, objv[1], &pBl
cb10: 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ob) ) return TCL
cb20: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 43  _ERROR;.  if( TC
cb30: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
cb40: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
cb50: 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65  objv[2], &iOffse
cb60: 74 29 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  t) ){ .    retur
cb70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cb80: 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47  ..  zBuf = Tcl_G
cb90: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
cba0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75  bj(objv[3], &nBu
cbb0: 66 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  f);.  if( objc==
cbc0: 35 20 26 26 20 54 63 6c 5f 47 65 74 49 6e 74 46  5 && Tcl_GetIntF
cbd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
cbe0: 62 6a 76 5b 34 5d 2c 20 26 6e 42 75 66 29 20 29  bjv[4], &nBuf) )
cbf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
cc00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
cc10: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
cc20: 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a 42 75  write(pBlob, zBu
cc30: 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73 65 74  f, nBuf, iOffset
cc40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
cc50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
cc60: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
cc70: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
cc80: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
cc90: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
cca0: 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  LE);.  }..  retu
ccb0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
ccc0: 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  K ? TCL_OK : TCL
ccd0: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74  _ERROR);.}..stat
cce0: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
ccf0: 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c 69 65 6e  _reopen(.  Clien
cd00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cd10: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
cd20: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cd30: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
cd40: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
cd50: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
cd60: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
cd70: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
cd80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd90: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
cda0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
cdb0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
cdc0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
cdd0: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49  /.){.  Tcl_WideI
cde0: 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c  nt iRowid;.  sql
cdf0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
ce00: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
ce10: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
ce20: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ce30: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
ce40: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 52 4f 57  jv, "CHANNEL ROW
ce50: 49 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ID");.    return
ce60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ce70: 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c  .  if( blobHandl
ce80: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
ce90: 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62   objv[1], &pBlob
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
cec0: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
ced0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
cee0: 5d 2c 20 26 69 52 6f 77 69 64 29 20 29 20 72 65  ], &iRowid) ) re
cef0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cf00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
cf10: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f  blob_reopen(pBlo
cf20: 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  b, iRowid);.  if
cf30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cf40: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
cf50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
cf60: 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
cf70: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
cf80: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
cf90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
cfa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c  =SQLITE_OK ? TCL
cfb0: 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29  _OK : TCL_ERROR)
cfc0: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
cfd0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
cfe0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
cff0: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
d000: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
d010: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
d020: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
d030: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
d040: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
d050: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
d060: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
d070: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
d080: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
d090: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
d0a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
d0b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
d0c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
d0d0: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
d0e0: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
d0f0: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
d100: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
d110: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
d120: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
d130: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
d140: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
d150: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
d160: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
d170: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
d180: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
d190: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
d1a0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
d1b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
d1c0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
d1d0: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
d1e0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
d1f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d200: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
d210: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d220: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
d230: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
d240: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
d250: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
d260: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
d270: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
d280: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
d290: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
d2a0: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
d2b0: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
d2c0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
d2d0: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
d2e0: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
d2f0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
d300: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
d310: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
d320: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
d330: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d340: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
d350: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d360: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
d370: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
d380: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
d390: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
d3a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d3b0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
d3c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
d3d0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
d3e0: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
d3f0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
d400: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
d410: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
d420: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
d430: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
d440: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
d450: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
d460: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
d470: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
d480: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
d490: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
d4a0: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
d4b0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
d4c0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
d4d0: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
d4e0: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
d4f0: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
d500: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
d510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d520: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
d530: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
d540: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
d550: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
d560: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
d570: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
d580: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d5a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d5b0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
d5c0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
d5d0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
d5e0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
d5f0: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
d600: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d610: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
d620: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
d630: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d640: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d650: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
d660: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
d670: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
d680: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d690: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
d6a0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d6b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d6c0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
d6d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
d6e0: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
d6f0: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
d700: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
d710: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
d720: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
d730: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
d740: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
d750: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
d760: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d770: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
d780: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
d790: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
d7a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
d7b0: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
d7c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d7d0: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
d7e0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
d7f0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
d800: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
d810: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
d820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d830: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
d840: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d850: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
d860: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
d870: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
d880: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
d890: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
d8a0: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
d8b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d8c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
d8d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d8e0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
d8f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d900: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
d910: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
d920: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
d930: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
d940: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
d950: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
d960: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d970: 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c  /*.** USAGE: sql
d980: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
d990: 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20  tion_v2 DB NAME 
d9a0: 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48  NARG ENC ?SWITCH
d9b0: 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ES?.**.** Availa
d9c0: 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65  ble switches are
d9d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20  :.**.**   -func 
d9e0: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
d9f0: 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a  step    SCRIPT.*
da00: 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52  *   -final   SCR
da10: 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f  IPT.**   -destro
da20: 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65  y SCRIPT.*/.type
da30: 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74  def struct Creat
da40: 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61  eFunctionV2 Crea
da50: 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74  teFunctionV2;.st
da60: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
da70: 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e  ionV2 {.  Tcl_In
da80: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
da90: 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20  Tcl_Obj *pFunc; 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75  /* Script for fu
dac0: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
dad0: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
dae0: 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  pStep;          
daf0: 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74         /* Script
db00: 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69   for agg. step i
db10: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
db20: 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20  cl_Obj *pFinal; 
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db40: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67  * Script for agg
db50: 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69  . finalization i
db60: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
db70: 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79  cl_Obj *pDestroy
db80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
db90: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72  * Destructor scr
dba0: 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  ipt */.};.static
dbb0: 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71   void cf2Func(sq
dbc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
dbd0: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
dbe0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
dbf0: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
dc00: 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74  id cf2Step(sqlit
dc10: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
dc20: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
dc30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
dc40: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
dc50: 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  cf2Final(sqlite3
dc60: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
dc70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66  }.static void cf
dc80: 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  2Destroy(void *p
dc90: 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46  User){.  CreateF
dca0: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28  unctionV2 *p = (
dcb0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
dcc0: 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28   *)pUser;..  if(
dcd0: 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d   p->interp && p-
dce0: 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >pDestroy ){.   
dcf0: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
dd00: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
dd10: 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20  p, p->pDestroy, 
dd20: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
dd30: 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63  TCL_OK ) Tcl_Bac
dd40: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
dd50: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
dd60: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
dd70: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
dd80: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
dd90: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
dda0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
ddb0: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
ddc0: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
ddd0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
dde0: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
ddf0: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
de00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
de10: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20  ->pDestroy); .  
de20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
de30: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
de40: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
de50: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
de60: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
de70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
de80: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
de90: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
dea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
deb0: 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e   invoking TCL in
dec0: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
ded0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
def0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
df00: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
df10: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
df20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
df30: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
df40: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
df50: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
df60: 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20  r *zFunc;.  int 
df70: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b  nArg;.  int enc;
df80: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
df90: 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  nV2 *p;.  int i;
dfa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74  .  int rc;..  st
dfb0: 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a  ruct EncTable {.
dfc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dfd0: 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e  zEnc;.    int en
dfe0: 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20  c;.  } aEnc[] = 
dff0: 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20  {.    {"utf8",  
e000: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c    SQLITE_UTF8 },
e010: 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20  .    {"utf16",  
e020: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c   SQLITE_UTF16 },
e030: 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c  .    {"utf16le",
e040: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
e050: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65  },.    {"utf16be
e060: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
e070: 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c  E },.    {"any",
e080: 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20       SQLITE_ANY 
e090: 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d  },.    {"0", 0 }
e0a0: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
e0b0: 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d  c<5 || (objc%2)=
e0c0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =0 ){.    Tcl_Wr
e0d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e0e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
e0f0: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57  NAME NARG ENC SW
e100: 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20  ITCHES...");.   
e110: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e120: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
e130: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
e140: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e150: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
e160: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e170: 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63  OR;.  zFunc = Tc
e180: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e190: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
e1a0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
e1b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
e1c0: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
e1d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
e1e0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
e1f0: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
e200: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c  , objv[4], aEnc,
e210: 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29   sizeof(aEnc[0])
e220: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e  , .          "en
e230: 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63  coding", 0, &enc
e240: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
e250: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e260: 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e  .  enc = aEnc[en
e270: 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73  c].enc;..  p = s
e280: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
e290: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
e2a0: 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72  ionV2));.  asser
e2b0: 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74  t( p );.  memset
e2c0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72  (p, 0, sizeof(Cr
e2d0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29  eateFunctionV2))
e2e0: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
e2f0: 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69  interp;..  for(i
e300: 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32  =5; i<objc; i+=2
e310: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74  ){.    int iSwit
e320: 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ch;.    const ch
e330: 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d  ar *azSwitch[] =
e340: 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65   {"-func", "-ste
e350: 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d  p", "-final", "-
e360: 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20  destroy", 0};.  
e370: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
e380: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
e390: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69  , objv[i], azSwi
e3a0: 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30  tch, "switch", 0
e3b0: 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20  , &iSwitch) ){. 
e3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e3d0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
e3e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e3f0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
e400: 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   iSwitch ){.    
e410: 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75    case 0: p->pFu
e420: 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  nc = objv[i+1]; 
e430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e440: 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74    case 1: p->pSt
e450: 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  ep = objv[i+1]; 
e460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e470: 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69    case 2: p->pFi
e480: 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b  nal = objv[i+1];
e490: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e4a0: 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65    case 3: p->pDe
e4b0: 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31  stroy = objv[i+1
e4c0: 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ];   break;.    
e4d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
e4e0: 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20  Func ) p->pFunc 
e4f0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
e500: 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  bj(p->pFunc); . 
e510: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e520: 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44  p->pStep = Tcl_D
e530: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e540: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
e550: 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69  >pFinal ) p->pFi
e560: 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  nal = Tcl_Duplic
e570: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c  ateObj(p->pFinal
e580: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
e590: 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74  stroy ) p->pDest
e5a0: 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  roy = Tcl_Duplic
e5b0: 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72  ateObj(p->pDestr
e5c0: 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e  oy); ..  if( p->
e5d0: 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72  pFunc ) Tcl_Incr
e5e0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
e5f0: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
e600: 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  tep ) Tcl_IncrRe
e610: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
e620: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
e630: 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  al ) Tcl_IncrRef
e640: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
e650: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
e660: 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52  troy ) Tcl_IncrR
e670: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
e680: 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73  roy); ..  rc = s
e690: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e6a0: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
e6b0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
e6c0: 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20  (void *)p, .    
e6d0: 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66    (p->pFunc ? cf
e6e0: 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20  2Func : 0),.    
e6f0: 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66    (p->pStep ? cf
e700: 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20  2Step : 0),.    
e710: 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63    (p->pFinal ? c
e720: 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20  f2Final : 0),.  
e730: 20 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20      cf2Destroy. 
e740: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
e750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
e760: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
e770: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
e780: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e790: 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
e7a0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
e7b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e7c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
e7d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e7e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
e7f0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
e800: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
e810: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
e820: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
e830: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
e840: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
e850: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
e860: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
e870: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
e880: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
e890: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
e8a0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
e8b0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e8d0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
e8e0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
e8f0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
e900: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
e910: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
e920: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
e930: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
e940: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
e950: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
e960: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
e970: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
e980: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
e990: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
e9a0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
e9b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e9c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
e9d0: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
e9e0: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
e9f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea00: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
ea10: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ea20: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
ea30: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
ea40: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
ea50: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
ea60: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ea70: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
ea80: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
ea90: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
eaa0: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
eab0: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
eac0: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
ead0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
eae0: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
eaf0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
eb00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
eb10: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
eb20: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
eb30: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
eb40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
eb50: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
eb60: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
eb70: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
eb80: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
eb90: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
eba0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
ebb0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
ebc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
ebd0: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
ebe0: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
ebf0: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
ec00: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
ec10: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
ec20: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
ec30: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
ec40: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
ec50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
ec60: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
ec70: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
ec80: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
ec90: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
eca0: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
ecb0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
ecc0: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
ecd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
ece0: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
ecf0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
ed00: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
ed10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ed20: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
ed30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
ed40: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
ed50: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
ed60: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
ed70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
ed80: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
ed90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eda0: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
edb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
edc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
edd0: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
ede0: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
edf0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
ee00: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
ee10: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
ee20: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
ee30: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
ee40: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ee50: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
ee60: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
ee70: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
ee80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
ee90: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
eea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
eeb0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
eec0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
eed0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
eee0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
eef0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
ef00: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
ef10: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
ef20: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
ef30: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
ef40: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ef50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ef60: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
ef70: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
ef80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ef90: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
efa0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
efb0: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
efc0: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
efd0: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
efe0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
eff0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
f000: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
f010: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
f020: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
f030: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f040: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
f050: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
f060: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f070: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f080: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
f090: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
f0a0: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
f0b0: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
f0c0: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
f0d0: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
f0e0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
f0f0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
f100: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f110: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
f120: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
f130: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
f140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f150: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
f160: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
f170: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
f180: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
f190: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
f1a0: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
f1b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
f1c0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
f1d0: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
f1e0: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
f1f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f200: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f210: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
f220: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
f230: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
f240: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
f250: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
f260: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
f270: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
f280: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
f290: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
f2a0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
f2b0: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
f2c0: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
f2d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f2e0: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
f2f0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
f300: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f310: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
f320: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
f330: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
f340: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
f350: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
f360: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f370: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
f380: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
f390: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
f3a0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
f3b0: 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e   */.){.#if defin
f3c0: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f  ed(_MSC_VER).  /
f3d0: 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74  * We do this, ot
f3e0: 68 65 72 77 69 73 65 20 74 68 65 20 74 65 73 74  herwise the test
f3f0: 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20   will halt with 
f400: 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a  a popup message.
f410: 20 20 20 2a 20 74 68 61 74 20 77 65 20 68 61 76     * that we hav
f420: 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20  e to click away 
f430: 62 65 66 6f 72 65 20 74 68 65 20 74 65 73 74 20  before the test 
f440: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  will continue.. 
f450: 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72    */.  _set_abor
f460: 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f  t_behavior( 0, _
f470: 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54  CALL_REPORTFAULT
f480: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69   );.#endif.  exi
f490: 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74  t(255);.  assert
f4a0: 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20  ( interp==0 );  
f4b0: 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   /* This will al
f4c0: 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72  ways fail */.  r
f4d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f4f0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
f500: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53  a user-defined S
f510: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73  QL function whos
f520: 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20  e purpose.** is 
f530: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
f540: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20  te_set_result() 
f550: 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  API..*/.static v
f560: 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c  oid testFunc(sql
f570: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
f580: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
f590: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
f5a0: 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28  *argv){.  while(
f5b0: 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
f5c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
f5d0: 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  0 = (char*)sqlit
f5e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
f5f0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
f600: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
f610: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
f620: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
f630: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
f640: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f650: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
f660: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
f670: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
f680: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
f690: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
f6a0: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
f6b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f6c0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
f6d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
f6e0: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
f6f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f700: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f710: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
f720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f730: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
f740: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
f750: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
f760: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31  ext(argv[1]), -1
f770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,.            SQ
f780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
f790: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f7a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f7b0: 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d  zArg0,"double")=
f7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
f7d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
f7e0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ble(context, sql
f7f0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
f800: 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  e(argv[1]));.   
f810: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
f820: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
f830: 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  0,"null")==0 ){.
f840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f850: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
f860: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
f870: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f880: 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75  ICmp(zArg0,"valu
f890: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f8a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f8b0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
f8c0: 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c  argv[sqlite3_val
f8d0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d  ue_int(argv[1])]
f8e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f8f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
f900: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
f910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f920: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
f930: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20  .    }.    argc 
f940: 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b  -= 2;.    argv +
f950: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
f960: 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  n;..error_out:. 
f970: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f980: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66  error(context,"f
f990: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
f9a0: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
f9b0: 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74  ".      "int int
f9c0: 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65  64 string double
f9d0: 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31   null value", -1
f9e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
f9f0: 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69  e:   sqlite_regi
fa00: 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
fa10: 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a  on  DB  NAME.**.
fa20: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
fa30: 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f  test SQL functio
fa40: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
fa50: 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e  e DB under the n
fa60: 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61  ame NAME..*/.sta
fa70: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67  tic int test_reg
fa80: 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f  ister_func(.  vo
fa90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
faa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
fac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
fad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
fae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
faf0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
fb00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fb10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
fb20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
fb30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
fb40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
fb50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
fb60: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
fb70: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
fb80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fb90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
fba0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
fbb0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
fbc0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
fbd0: 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20  FUNCTION-NAME", 
fbe0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
fbf0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
fc00: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
fc10: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
fc20: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
fc30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
fc40: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
fc50: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
fc60: 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
fc70: 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20  E_UTF8, 0, .    
fc80: 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30    testFunc, 0, 0
fc90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
fca0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
fcb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
fcc0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
fcd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
fce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fcf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
fd00: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
fd10: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
fd20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
fd30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
fd40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
fd50: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
fd60: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e   STMT .**.** Fin
fd70: 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
fd80: 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
fd90: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e  tic int test_fin
fda0: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
fdb0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
fdc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fdd0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
fde0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
fdf0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
fe00: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
fe10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
fe20: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
fe30: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
fe40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
fe50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
fe60: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
fe70: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
fe80: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
fe90: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
fea0: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
feb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
fec0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
fed0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
fee0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
fef0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
ff00: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ff10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ff20: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ff30: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ff40: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ff50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ff60: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ff70: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ff80: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ff90: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ffa0: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ffb0: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ffc0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ffd0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ffe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10000 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10010 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
10020 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
10030 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
10040 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
10050 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
10060 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
10070 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
10080 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61  nt test_stmt_sta
10090 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tus(.  void * cl
100a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
100b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
100c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
100d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
100e0 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61  v[].){.  int iVa
100f0 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70  lue;.  int i, op
10100 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63  , resetFlag;.  c
10110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
10120 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  me;.  sqlite3_st
10130 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74  mt *pStmt;..  st
10140 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
10150 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
10160 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
10170 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d  nt op;.  } aOp[]
10180 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
10190 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
101a0 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20  LLSCAN_STEP",   
101b0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
101c0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
101d0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
101e0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
101f0 52 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RT",            
10200 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
10210 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20  S_SORT          
10220 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
10230 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
10240 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  TOINDEX",       
10250 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
10260 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20  S_AUTOINDEX     
10270 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20    },.  };.  if( 
10280 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
10290 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
102a0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
102b0 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52   "STMT PARAMETER
102c0 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20   RESETFLAG");.  
102d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
102e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
102f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10300 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10310 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10320 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10330 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61  L_ERROR;.  zOpNa
10340 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
10350 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
10360 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
10370 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aOp); i++){.
10380 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
10390 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70  Op[i].zName, zOp
103a0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
103b0 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70    op = aOp[i].op
103c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
103d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
103e0 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29  >=ArraySize(aOp)
103f0 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
10400 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
10410 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
10420 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  op) ) return TCL
10430 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
10440 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
10450 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10460 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46  objv[3], &resetF
10470 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  lag) ) return TC
10480 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75  L_ERROR;.  iValu
10490 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e = sqlite3_stmt
104a0 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f  _status(pStmt, o
104b0 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  p, resetFlag);. 
104c0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
104d0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
104e0 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29  wIntObj(iValue))
104f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10500 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10510 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
10520 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
10530 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10540 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
10550 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
10560 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
10570 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73   int test_next_s
10580 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tmt(.  void * cl
10590 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
105a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
105b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
105c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
105d0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
105e0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
105f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
10600 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
10610 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
10620 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10630 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10640 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10650 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
10660 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
10670 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10680 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54  [0], 0), " DB ST
10690 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
106a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
106b0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
106c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
106d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
106e0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
106f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10700 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10710 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10720 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10730 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  2]), &pStmt) ) r
10740 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10750 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
10760 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c  e3_next_stmt(db,
10770 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70   pStmt);.  if( p
10780 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
10790 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
107a0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
107b0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
107c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
107d0 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
107e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
107f0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
10800 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10810 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10820 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
10830 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  donly  STMT.**.*
10840 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10850 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20   STMT is a NULL 
10860 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69  pointer or a poi
10870 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
10880 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67  ent.** that is g
10890 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61  uaranteed to lea
108a0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
108b0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
108c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
108d0 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
108e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
108f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10900 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10910 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10920 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10930 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10940 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
10950 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
10960 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
10970 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10980 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
10990 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
109a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
109b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
109c0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
109d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
109e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
109f0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10a00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10a10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10a20 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10a40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10a50 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
10a60 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
10a70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10a80 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10a90 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
10aa0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
10ab0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10ac0 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20  te3_reset  STMT 
10ad0 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  .**.** Reset a s
10ae0 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
10af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
10b00 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
10b10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10b20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10b30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10b40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10b50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10b60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10b70 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
10b80 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10b90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10ba0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10bb0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10bc0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10bd0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10be0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10bf0 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
10c00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10c20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10c30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10c40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10c50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
10c60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10c70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10c80 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
10c90 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
10ca0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
10cb0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
10cc0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
10cd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10ce0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
10cf0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
10d00 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
10d10 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
10d20 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
10d30 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
10d40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10d50 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
10d60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10d70 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
10d80 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
10d90 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10da0 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
10db0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10dc0 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
10dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10de0 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
10df0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10e00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10e10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10e20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10e30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10e50 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
10e60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10e70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Stmt;.  if( objc
10e80 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10e90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10ea0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10eb0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10ec0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10ed0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10ee0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
10ef0 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
10f00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10f10 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
10f20 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10f30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10f40 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10f50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10f60 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10f70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10f80 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10f90 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72  bj(sqlite3_expir
10fa0 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e  ed(pStmt)));.#en
10fb0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
10fc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10fd0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72  age:  sqlite3_tr
10fe0 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20  ansfer_bindings 
10ff0 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a  FROMSTMT TOSTMT.
11000 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61  **.** Transfer a
11010 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d  ll bindings from
11020 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74   FROMSTMT over t
11030 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74  o TOSTMT.*/.stat
11040 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e  ic int test_tran
11050 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69  sfer_bind(.  voi
11060 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11070 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11080 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11090 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
110a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
110b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
110c0 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
110d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
110e0 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69  t1, *pStmt2;.  i
110f0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
11100 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11110 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
11120 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
11130 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
11140 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11150 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
11160 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54  ), " FROM-STMT T
11170 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  O-STMT", 0);.   
11180 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11190 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
111a0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
111b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
111c0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
111d0 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt1)) return TCL
111e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
111f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11200 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11210 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
11220 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43  tmt2)) return TC
11230 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
11240 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11250 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
11260 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11270 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
11280 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29  s(pStmt1,pStmt2)
11290 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
112a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
112b0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
112c0 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a  ite3_changes DB.
112d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
112e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
112f0 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
11300 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c  atabase by the l
11310 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75  ast SQL.** execu
11320 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
11330 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73  int test_changes
11340 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11350 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11360 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11370 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11380 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11390 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
113a0 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
113b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
113c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
113d0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
113e0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
113f0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
11400 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
11410 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
11420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11430 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
11440 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
11450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11460 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
11470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11480 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11490 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
114a0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
114b0 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
114c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
114d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
114e0 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
114f0 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
11500 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
11510 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
11520 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
11530 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
11540 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
11550 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
11560 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11570 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
11580 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
11590 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
115a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
115b0 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
115c0 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
115d0 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
115e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
115f0 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20  DX-th occurance 
11600 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
11610 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
11620 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
11630 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
11640 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
11650 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
11660 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
11670 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
11680 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
11690 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
116a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
116b0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
116c0 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
116d0 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
116e0 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
116f0 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
11700 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
11710 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
11720 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
11730 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ade.  If FLAGS==
11740 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20  "blob10" then a 
11750 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64  VALUE is ignored
11760 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65  .** an a 10-byte
11770 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79   blob "abc\000xy
11780 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65  z\000pq" is inse
11790 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
117a0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20  int test_bind(. 
117b0 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
117c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
117d0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
117e0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
117f0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
11800 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
11810 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
11820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11830 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
11840 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
11850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
11860 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
11870 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
11880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11890 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
118a0 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  dx;.  if( argc!=
118b0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
118c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
118d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
118e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
118f0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
11900 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20   " VM IDX VALUE 
11910 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72  (null|static|nor
11920 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20  mal)\"", 0);.   
11930 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11940 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
11950 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
11960 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53  rp, argv[1], &pS
11970 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
11980 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
11990 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
119a0 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29  , argv[2], &idx)
119b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
119c0 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
119d0 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22  p(argv[4],"null"
119e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
119f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
11a00 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
11a10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11a20 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
11a30 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ic")==0 ){.    r
11a40 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
11a50 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
11a60 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
11a70 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20  bind_value, -1, 
11a80 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
11a90 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
11aa0 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d  static-nbytes")=
11ab0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
11ac0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
11ad0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
11ae0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11af0 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11b20 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
11b30 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65  _nbyte, 0);.  }e
11b40 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
11b50 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29  rgv[4],"normal")
11b60 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11b70 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
11b80 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72  t(pStmt, idx, ar
11b90 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[3], -1, SQLIT
11ba0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
11bb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11bc0 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30  (argv[4],"blob10
11bd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
11be0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
11bf0 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
11c00 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
11c10 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53  q", 10, SQLITE_S
11c20 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
11c30 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11c40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34  esult(interp, "4
11c50 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  th argument shou
11c60 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
11c70 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73  "\"null\" or \"s
11c80 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72  tatic\" or \"nor
11c90 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  mal\"", 0);.    
11ca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11cb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
11cc0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
11cd0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
11ce0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
11cf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11d00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11d10 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
11d20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
11d30 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
11d40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11d50 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
11d60 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
11d70 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
11d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
11da0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
11db0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
11dc0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
11dd0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c  d_test_collate <
11de0 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c  db ptr> <utf8> <
11df0 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
11e00 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e>.**.** This fu
11e10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
11e20 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
11e30 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63  te selects the c
11e40 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e  orrect collation
11e50 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c  .** sequence cal
11e60 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
11e70 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
11e80 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
11e90 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
11ea0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
11eb0 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
11ec0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
11ed0 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rs the collation
11ee0 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f   sequence "test_
11ef0 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68  collate".** with
11f00 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11f10 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e   <db>. The secon
11f20 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  d argument must 
11f30 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72  be a list of thr
11f40 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  ee.** boolean va
11f50 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72  lues. If the fir
11f60 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  st is true, then
11f70 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
11f80 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a  st_collate is.**
11f90 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
11fa0 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65  UTF-8, if the se
11fb0 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20  cond is true, a 
11fc0 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
11fd0 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46  tered for.** UTF
11fe0 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68  -16le, if the th
11ff0 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55  ird is true, a U
12000 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
12010 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
12020 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
12030 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  ns of test_colla
12040 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  te are deleted..
12050 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
12060 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73  ion sequence tes
12070 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70  t_collate is imp
12080 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
12090 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  ing the.** follo
120a0 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
120b0 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63  .**.**   "test_c
120c0 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68  ollate <enc> <lh
120d0 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20  s> <rhs>".**.** 
120e0 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72  The <lhs> and <r
120f0 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20  hs> are the two 
12100 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d  values being com
12110 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69  pared, encoded i
12120 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20  n UTF-8..** The 
12130 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20  <enc> parameter 
12140 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  is the encoding 
12150 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
12160 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
12170 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65  * SQLite selecte
12180 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54  d to call. The T
12190 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69  CL test script i
121a0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a  mplements the.**
121b0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20   "test_collate" 
121c0 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  proc..**.** Note
121d0 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20   that this will 
121e0 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f  only work with o
121f0 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61 74  ne intepreter at
12200 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a   a time, as the.
12210 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65  ** interp pointe
12220 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76  r to use when ev
12230 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c  aluating the TCL
12240 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65   script is store
12250 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c  d in.** pTestCol
12260 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73  lateInterp..*/.s
12270 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70  tatic Tcl_Interp
12280 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
12290 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74  terp;.static int
122a0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
122b0 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  nc(.  void *pCtx
122c0 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e  , .  int nA, con
122d0 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
122e0 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nB, const voi
122f0 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49  d *zB.){.  Tcl_I
12300 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74  nterp *i = pTest
12310 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20  CollateInterp;. 
12320 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c   int encin = SQL
12330 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
12340 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Ctx);.  int res;
12350 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c  .  int n;..  sql
12360 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12370 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
12380 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ..  pX = Tcl_New
12390 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
123a0 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20  collate", -1);. 
123b0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
123c0 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68  t(pX);..  switch
123d0 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63  ( encin ){.    c
123e0 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a  ase SQLITE_UTF8:
123f0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
12400 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12410 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
12420 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31  ngObj("UTF-8",-1
12430 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
12440 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12450 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
12460 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12470 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
12480 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12490 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a  UTF-16LE",-1));.
124a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
124b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
124c0 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16BE:.      Tcl_
124d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
124e0 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
124f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
12500 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16BE",-1));.    
12510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
12520 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
12530 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  rt(0);.  }..  sq
12540 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12550 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c  Malloc();.  pVal
12560 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
12570 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61  ew(0);.  if( pVa
12580 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
12590 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
125a0 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c  , nA, zA, encin,
125b0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
125c0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
125d0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
125e0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
125f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12600 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
12610 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12620 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12630 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12640 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12650 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
12660 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c  , nB, zB, encin,
12670 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12680 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
12690 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
126a0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
126b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
126c0 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
126d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
126e0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
126f0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12700 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12710 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
12720 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
12730 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12740 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ..  Tcl_EvalObjE
12750 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  x(i, pX, 0);.  T
12760 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12770 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e  pX);.  Tcl_GetIn
12780 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f  tFromObj(i, Tcl_
12790 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c  GetObjResult(i),
127a0 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   &res);.  return
127b0 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69   res;.}.static i
127c0 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  nt test_collate(
127d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
127e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
127f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12800 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12810 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12820 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12830 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
12840 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
12850 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
12860 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
12870 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
12880 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
12890 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69  rp = interp;.  i
128a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
128b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
128c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
128d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
128e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
128f0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
12900 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12910 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
12920 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
12930 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
12940 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12950 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
12960 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
12970 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
12980 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12990 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
129a0 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
129b0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
129c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
129d0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31  onst void *zUtf1
129e0 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  6;.    if( TCL_O
129f0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
12a00 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
12a10 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
12a20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12a30 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  OR;.    rc = sql
12a40 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12a50 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
12a60 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
12a70 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
12a80 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
12a90 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
12aa0 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
12ab0 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28  func:0);.    if(
12ac0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12ad0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
12ae0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
12af0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
12b00 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30  CL_ERROR;..#if 0
12b10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12b20 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
12b30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
12b40 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
12b50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12b60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12b70 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12b80 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
12b90 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
12ba0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12bb0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
12bc0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
12bd0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
12be0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
12bf0 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
12c00 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
12c10 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
12c20 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
12c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12c40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12c50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
12c70 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
12c80 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
12c90 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f   zUtf16, SQLITE_
12ca0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
12cb0 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
12cc0 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
12cd0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
12ce0 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  c:0);.    }.    
12cf0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
12d00 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
12d10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12d20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
12d30 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
12d40 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
12d50 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
12d60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
12d70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
12d90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12da0 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45  rp, sqlite3TestE
12db0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
12dc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12dd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
12de0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
12df0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
12e00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12e10 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12e20 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12e30 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
12e40 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
12e50 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
12e60 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
12e70 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
12e80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
12e90 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  ROR;.}../*.** Wh
12ea0 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  en the collation
12eb0 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b   needed callback
12ec0 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63   is invoked, rec
12ed0 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ord the name of 
12ee0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
12ef0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  d collating func
12f00 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20  tion here.  The 
12f10 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73  recorded name is
12f20 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20   linked.** to a 
12f30 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64  TCL variable and
12f40 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
12f50 72 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75  re that the requ
12f60 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a  ested collation.
12f70 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65  ** name is corre
12f80 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ct..*/.static ch
12f90 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  ar zNeededCollat
12fa0 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63  ion[200];.static
12fb0 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43   char *pzNeededC
12fc0 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64  ollation = zNeed
12fd0 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f  edCollation;.../
12fe0 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
12ff0 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
13000 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e  uence is needed.
13010 20 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69    Registered usi
13020 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  ng.** sqlite3_co
13030 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
13040 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
13050 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  id test_collate_
13060 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69  needed_cb(.  voi
13070 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69  d *pCtx, .  sqli
13080 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
13090 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74  TextRep,.  const
130a0 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a   void *pName.){.
130b0 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28    int enc = ENC(
130c0 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db);.  int i;.  
130d0 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a  char *z;.  for(z
130e0 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c   = (char*)pName,
130f0 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d   i=0; *z || z[1]
13100 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; z++){.    if( 
13110 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  *z ) zNeededColl
13120 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b  ation[i++] = *z;
13130 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f  .  }.  zNeededCo
13140 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a  llation[i] = 0;.
13150 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13160 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20  _collation(.    
13170 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c    db, "test_coll
13180 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 53  ate", ENC(db), S
13190 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
131a0 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c  (enc), test_coll
131b0 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a  ate_func);.}../*
131c0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
131d0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
131e0 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  ed DB.*/.static 
131f0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
13200 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20  _needed(.  void 
13210 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13220 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13230 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13240 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13250 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13260 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
13270 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
13280 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =2 ) goto bad_ar
13290 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
132a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
132b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
132c0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
132d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
132e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
132f0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
13300 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f  6(db, 0, test_co
13310 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29  llate_needed_cb)
13320 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  ;.  zNeededColla
13330 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69  tion[0] = 0;.  i
13340 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
13350 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
13360 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
13380 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f  rn TCL_OK;..bad_
13390 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e  args:.  Tcl_Wron
133a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
133b0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
133c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
133d0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  ROR;.}../*.** tc
133e0 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69 67  lcmd:   add_alig
133f0 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
13400 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20  tions  DB.**.** 
13410 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c  Add two new coll
13420 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
13430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13440 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66  DB.**.**     utf
13450 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20  16_aligned.**   
13460 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65    utf16_unaligne
13470 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  d.**.** Both col
13480 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
13490 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 6f   use the same so
134a0 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e 41  rt order as BINA
134b0 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  RY..** The only 
134c0 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68  difference is th
134d0 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c 69  at the utf16_ali
134e0 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  gned collating.*
134f0 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64 65  * sequence is de
13500 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65 20  clared with the 
13510 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
13520 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f  GNED flag..** Bo
13530 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  th collating fun
13540 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74  ctions increment
13550 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 75   the unaligned u
13560 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  tf16 counter.** 
13570 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73 65  whenever they se
13580 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
13590 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64  begins on an odd
135a0 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a   byte boundary..
135b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
135c0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
135d0 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61 74  ounter = 0;.stat
135e0 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74  ic int alignment
135f0 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
13600 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74   *NotUsed,.  int
13610 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
13620 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
13630 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
13640 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
13650 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
13660 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
13670 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69  ey1 : nKey2;.  i
13680 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d  f( nKey1>0 && 1=
13690 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52 5f  =(1&(SQLITE_PTR_
136a0 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29 29 20  TO_INT(pKey1))) 
136b0 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  ) unaligned_stri
136c0 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ng_counter++;.  
136d0 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20 31  if( nKey2>0 && 1
136e0 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52  ==(1&(SQLITE_PTR
136f0 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29 29 29  _TO_INT(pKey2)))
13700 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
13710 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
13720 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
13730 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
13740 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
13750 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
13760 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
13770 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
13780 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  int add_alignmen
13790 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
137a0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
137b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
137c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
137d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
137e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
137f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
13800 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d  db;.  if( objc>=
13810 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  2 ){.    if( get
13820 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
13830 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13840 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
13850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13860 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  R;.    sqlite3_c
13870 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
13880 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69  db, "utf16_unali
13890 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
138a0 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  F16, .        0,
138b0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
138c0 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
138d0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
138e0 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c 69  n(db, "utf16_ali
138f0 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
13900 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
13910 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
13920 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
13930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13940 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
13950 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13960 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
13970 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
13980 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
13990 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
139a0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
139b0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
139c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
139d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
139e0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
139f0 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
13a00 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
13a10 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
13a20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
13a30 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
13a40 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
13a50 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
13a60 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
13a70 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
13a80 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
13a90 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
13aa0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
13ab0 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
13ac0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13ad0 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
13ae0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13af0 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
13b00 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
13b10 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
13b20 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
13b30 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
13b40 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
13b50 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
13b60 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
13b70 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
13b80 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
13b90 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
13ba0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
13bb0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
13bc0 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
13bd0 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
13be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
13bf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
13c00 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
13c10 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
13c20 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
13c30 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
13c40 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
13c50 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
13c60 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
13c70 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
13c80 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
13c90 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
13ca0 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
13cb0 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
13cc0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
13cd0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
13ce0 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
13cf0 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
13d00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
13d10 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
13d20 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
13d30 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
13d40 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
13d50 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
13d60 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
13d70 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
13d80 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
13d90 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
13da0 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
13db0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
13dc0 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
13dd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13de0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
13df0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
13e00 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
13e10 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
13e20 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
13e30 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
13e40 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
13e50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13e60 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
13e70 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
13e80 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
13e90 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
13ea0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
13eb0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
13ec0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13ed0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
13ee0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
13ef0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
13f00 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13f10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13f20 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
13f30 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
13f40 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
13f50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13f60 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
13f70 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
13f80 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
13f90 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
13fa0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
13fb0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
13fc0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
13fd0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
13fe0 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
13ff0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
14000 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
14010 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
14020 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14030 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
14040 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14050 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
14060 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
14070 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
14080 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
14090 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
140a0 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
140b0 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
140c0 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
140d0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
140e0 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
140f0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
14100 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
14110 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
14120 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
14130 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
14140 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
14150 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
14160 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
14170 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
14180 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
14190 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
141a0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
141b0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
141c0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
141d0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
141e0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
141f0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
14200 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
14210 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
14220 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
14230 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
14240 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
14250 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
14260 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
14270 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
14280 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
14290 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
142a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
142b0 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
142c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
142d0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
142e0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
142f0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
14300 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
14310 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
14320 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14330 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
14340 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
14350 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
14360 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
14370 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
14380 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
14390 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
143a0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
143b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
143c0 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
143d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
143e0 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
143f0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14400 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
14410 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
14420 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
14430 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
14440 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
14450 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
14460 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14470 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
14480 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
14490 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
144a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
144b0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
144c0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
144d0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
144e0 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
144f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14500 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
14510 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
14520 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14530 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14540 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14550 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
14560 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
14570 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
14580 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14590 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
145a0 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
145b0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
145c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
145d0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
145e0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
145f0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
14600 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
14610 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
14620 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14630 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
14640 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14650 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
14660 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14670 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
14680 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
14690 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
146a0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
146b0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
146c0 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
146d0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
146e0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
146f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14700 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
14710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14720 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
14730 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
14740 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14750 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14760 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
14770 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
14780 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
14790 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
147a0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
147b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
147c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
147d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
147e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
147f0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
14800 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14810 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14820 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
14830 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
14840 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
14850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14860 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
14870 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
14880 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
14890 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
148a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
148b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
148c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
148d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
148e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
148f0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
14900 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
14910 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
14920 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
14930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
14940 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
14950 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14960 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
14970 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
14980 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
14990 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
149a0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20  _function_utf8, 
149b0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
149c0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
149d0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
149e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
149f0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
14a00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14a10 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
14a20 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14a30 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
14a40 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
14a50 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
14a60 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
14a70 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
14a80 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
14a90 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
14aa0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
14ab0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
14ac0 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
14ad0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
14ae0 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
14af0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14b00 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
14b10 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
14b20 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
14b30 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
14b40 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14b50 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16be, 0, 0);.  }
14b60 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
14b70 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  K;.bad_args:.  T
14b80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14b90 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
14ba0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
14bb0 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
14bc0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14bd0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
14be0 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
14bf0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
14c00 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
14c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
14c20 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
14c30 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
14c40 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  * Usage:        
14c50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72   sqlite3_test_er
14c60 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a  rstr <err code>.
14c70 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20  **.** Test that 
14c80 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67  the english lang
14c90 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75 69  uage string equi
14ca0 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69  valents for sqli
14cb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a  te error codes.*
14cc0 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20  * are sane. The 
14cd0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
14ce0 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
14cf0 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65  ting an sqlite e
14d00 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68  rror code..** Th
14d10 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69  e result is a li
14d20 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e  st of two elemen
14d30 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72  ts, the string r
14d40 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
14d50 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   the.** error co
14d60 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69  de and the engli
14d70 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
14d80 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  anation..*/.stat
14d90 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 73  ic int test_errs
14da0 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  tr(.  void * cli
14db0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
14dc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
14dd0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
14de0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
14df0 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  [].){.  char *zC
14e00 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ode;.  int i;.  
14e10 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
14e20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14e30 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
14e40 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64  bjv, "<error cod
14e50 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f  e>");.  }..  zCo
14e60 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  de = Tcl_GetStri
14e70 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66  ng(objv[1]);.  f
14e80 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69  or(i=0; i<200; i
14e90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
14ea0 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e 61  strcmp(t1ErrorNa
14eb0 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29 20  me(i), zCode) ) 
14ec0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
14ed0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14ee0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
14ef0 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29 3b  e3ErrStr(i), 0);
14f00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14f20 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a  :    breakpoint.
14f30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14f40 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f 6e  ne exists for on
14f50 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20 70  e purpose - to p
14f60 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20 74  rovide a place t
14f70 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b  o put a.** break
14f80 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20 74  point with GDB t
14f90 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67 67  hat can be trigg
14fa0 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20 63  ered using TCL c
14fb0 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a  ode.  The use.**
14fc0 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68 65   for this is whe
14fd0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
14fe0 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73 61  est fails on (sa
14ff0 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69 74  y) the 1485th it
15000 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74  eration..** In t
15010 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
15020 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20 63  pt, we can add c
15030 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
15040 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69 3d  *.**     if {$i=
15050 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e  =1485} breakpoin
15060 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e  t.**.** Then run
15070 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e 20   testfixture in 
15080 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e 64  the debugger and
15090 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62 72   wait for the br
150a0 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66  eakpoint to.** f
150b0 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69 74  ire.  Then addit
150c0 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74  ional breakpoint
150d0 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20  s can be set to 
150e0 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20 62  trace down the b
150f0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
15100 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  t test_breakpoin
15110 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
15120 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
15130 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
15140 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
15150 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
15160 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
15170 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
15180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15190 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
151a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
151b0 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
151c0 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
151d0 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65  ument */.){.  re
151e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20  turn TCL_OK;    
151f0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
15200 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ng */.}../*.** U
15210 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
15220 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53  bind_zeroblob  S
15230 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20  TMT IDX N.**.** 
15240 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15250 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69  _bind_zeroblob i
15260 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
15270 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
15280 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20  atement..** IDX 
15290 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
152a0 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
152b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
152c0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
152d0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e  and.** binds a N
152e0 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  -byte zero-fille
152f0 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69  d BLOB to the wi
15300 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
15310 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
15320 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  zeroblob(.  void
15330 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15340 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15350 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15360 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15370 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15380 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15390 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
153a0 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  int n;.  int rc;
153b0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
153c0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
153d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
153e0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49  1, objv, "STMT I
153f0 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  DX N");.    retu
15400 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15410 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15420 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15430 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15440 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
15450 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15460 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15470 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15480 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
15490 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
154a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
154b0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
154c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
154d0 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
154e0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
154f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
15500 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78  oblob(pStmt, idx
15510 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , n);.  if( sqli
15520 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15530 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15540 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15570 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15580 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15590 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
155a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
155b0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
155c0 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41  d_int  STMT N VA
155d0 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
155e0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
155f0 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  int interface.  
15600 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
15610 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
15620 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
15630 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
15640 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
15650 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
15660 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
15670 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
15680 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
15690 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
156a0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
156b0 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
156c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
156d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
156e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
156f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15700 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15710 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
15720 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
15730 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
15740 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
15750 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
15760 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15770 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
15780 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
15790 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
157a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
157b0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
157c0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
157d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
157e0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
157f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
15800 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
15810 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
15820 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
15830 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
15840 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15850 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
15860 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
15870 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15880 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
15890 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
158a0 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72  [3], &value) ) r
158b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
158c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
158d0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
158e0 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
158f0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
15900 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
15910 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
15920 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
15930 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
15940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15950 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15960 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
15970 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
15980 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
15990 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
159a0 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
159b0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
159c0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
159d0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
159e0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
159f0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
15a00 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
15a10 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
15a20 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
15a30 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
15a40 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
15a50 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
15a60 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
15a70 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
15a80 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  int test_bind_in
15a90 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
15aa0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15ab0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15ac0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15ad0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15ae0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15af0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15b00 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20 76  int idx;.  i64 v
15b10 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
15b20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
15b30 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
15b40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
15b50 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
15b60 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
15b70 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
15b80 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
15b90 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
15ba0 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
15bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15bc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
15bd0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
15be0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15bf0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
15c00 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
15c10 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15c20 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
15c30 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
15c40 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
15c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15c60 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
15c70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15c80 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
15c90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15ca0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15cb0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
15cc0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
15cd0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15ce0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15cf0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
15d00 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
15d10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15d20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15d30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
15d40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15d60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
15d70 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15d80 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
15d90 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15da0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15db0 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
15dc0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
15dd0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15de0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
15df0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15e00 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15e10 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15e20 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
15e30 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
15e40 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
15e50 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
15e60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15e70 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
15e80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15e90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15ea0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15eb0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15ec0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15ed0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15ee0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15ef0 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b  .  double value;
15f00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
15f10 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  st char *zVal;. 
15f20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
15f30 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
15f40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15f50 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
15f60 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  me of the specia
15f70 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  l floating point
15f80 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e   value */.    un
15f90 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65  signed int iUppe
15fa0 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32  r;   /* Upper 32
15fb0 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73   bits */.    uns
15fc0 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72  igned int iLower
15fd0 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20  ;   /* Lower 32 
15fe0 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65  bits */.  } aSpe
15ff0 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20  cialFp[] = {.   
16000 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20   {  "NaN",      
16010 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66 66  0x7fffffff, 0xff
16020 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
16030 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37   "SNaN",     0x7
16040 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66  ff7ffff, 0xfffff
16050 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
16060 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66  NaN",     0xffff
16070 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
16080 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61   },.    {  "-SNa
16090 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66 66  N",    0xfff7fff
160a0 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
160b0 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20  .    {  "+Inf", 
160c0 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c 20      0x7ff00000, 
160d0 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
160e0 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20    {  "-Inf",    
160f0 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78 30   0xfff00000, 0x0
16100 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
16110 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78    "Epsilon",  0x
16120 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  00000000, 0x0000
16130 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
16140 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30  -Epsilon", 0x800
16150 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
16160 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e  1 },.    {  "NaN
16170 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30 30  0",     0x7ff800
16180 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
16190 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22  ,.    {  "-NaN0"
161a0 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30 2c  ,    0xfff80000,
161b0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
161c0 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
161d0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
161e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
161f0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16200 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16210 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
16220 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
16230 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
16240 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
16250 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16260 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16270 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
16280 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16290 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
162a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
162b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
162c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
162d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
162e0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
162f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16300 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74    /* Intercept t
16310 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20  he string "NaN" 
16320 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e  and generate a N
16330 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e  aN value for it.
16340 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  ** All other 
16350 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73 73  strings are pass
16360 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63  ed through to Tc
16370 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
16380 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47  bj()..  ** Tcl_G
16390 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
163a0 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74  ) should underst
163b0 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f  and "NaN" but so
163c0 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a  me versions.  **
163d0 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a   contain a bug..
163e0 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63    */.  zVal = Tc
163f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16400 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [3]);.  for(i=0;
16410 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69   i<sizeof(aSpeci
16420 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
16430 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b  ecialFp[0]); i++
16440 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
16450 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  p(aSpecialFp[i].
16460 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20  zName, zVal)==0 
16470 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16480 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20  _uint64 x;.     
16490 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b   x = aSpecialFp[
164a0 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20  i].iUpper;.     
164b0 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20   x <<= 32;.     
164c0 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70   x |= aSpecialFp
164d0 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20  [i].iLower;.    
164e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
164f0 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20  (value)==8 );.  
16500 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16510 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20  of(x)==8 );.    
16520 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c    memcpy(&value,
16530 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62   &x, 8);.      b
16540 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16550 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
16560 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65  aSpecialFp)/size
16570 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d  of(aSpecialFp[0]
16580 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54 63  ) &&.         Tc
16590 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
165a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
165b0 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20  3], &value) ){. 
165c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
165d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
165e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
165f0 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ble(pStmt, idx, 
16600 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
16610 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
16620 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
16630 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
16640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16650 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
16670 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16680 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16690 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
166a0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
166b0 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e  ind_null  STMT N
166c0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
166d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
166e0 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  l interface.  ST
166f0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16700 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16710 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16720 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16730 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16740 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16750 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16760 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64  NULL to the wild
16770 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
16780 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  int test_bind_nu
16790 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
167a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
167b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
167c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
167d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
167e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
167f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16800 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
16810 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
16820 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16830 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16840 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16850 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
16860 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16870 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16880 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16890 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  N", 0);.    retu
168a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
168b0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
168c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
168d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
168e0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
168f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16900 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16910 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16920 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
16930 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
16940 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
16950 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
16960 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
16970 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
16980 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
16990 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
169a0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
169b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
169c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
169d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
169e0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
169f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16a00 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16a10 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20  ite3_bind_text  
16a20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
16a30 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
16a40 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
16a50 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20  text interface. 
16a60 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16a70 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16a80 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16a90 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16aa0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16ab0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16ac0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16ad0 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
16ae0 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
16af0 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
16b00 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
16b10 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
16b20 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
16b30 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64  ind_text(.  void
16b40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16b50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16b60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16b70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16b80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16b90 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16ba0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16bb0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
16bc0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
16bd0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
16be0 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
16bf0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16c00 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16c10 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16c20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
16c30 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
16c40 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
16c50 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22  T N VALUE BYTES"
16c60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16c80 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16c90 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16ca0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16cb0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16cc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16cd0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16ce0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16cf0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
16d00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16d10 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
16d20 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
16d30 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
16d40 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a  jv[3], &bytes);.
16d50 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
16d60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16d70 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
16d80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16d90 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16da0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
16db0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
16dc0 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
16dd0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
16de0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16df0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
16e00 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
16e10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16e20 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
16e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16e40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16e50 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
16e60 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
16e70 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
16e80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16e90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
16ea0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
16eb0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
16ec0 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74  nd_text16 ?-stat
16ed0 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  ic? STMT N STRIN
16ee0 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
16ef0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
16f00 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72  ind_text16 inter
16f10 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
16f20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16f30 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
16f40 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
16f50 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
16f60 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
16f70 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
16f80 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20   binds a UTF-16 
16f90 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f  string STRING to
16fa0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
16fb0 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59  The string is BY
16fc0 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e  TES bytes.** lon
16fd0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
16fe0 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31   test_bind_text1
16ff0 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
17000 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17010 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17020 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17030 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17040 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
17050 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17060 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17070 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17080 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
17090 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
170a0 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28  nt rc;..  void (
170b0 2a 78 44 65 6c 29 28 29 20 3d 20 28 6f 62 6a 63  *xDel)() = (objc
170c0 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49  ==6?SQLITE_STATI
170d0 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  C:SQLITE_TRANSIE
170e0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  NT);.  Tcl_Obj *
170f0 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b  oStmt    = objv[
17100 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-4];.  Tcl_O
17110 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f  bj *oN       = o
17120 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54  bjv[objc-3];.  T
17130 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20  cl_Obj *oString 
17140 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b   = objv[objc-2];
17150 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74  .  Tcl_Obj *oByt
17160 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  es   = objv[objc
17170 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  -1];..  if( objc
17180 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b  !=5 && objc!=6){
17190 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
171a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
171b0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
171c0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
171d0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
171e0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
171f0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
17200 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
17210 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17220 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
17230 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17240 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17250 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26  String(oStmt), &
17260 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
17270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17280 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17290 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26  bj(interp, oN, &
172a0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
172b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
172c0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
172d0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
172e0 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20  j(oString, 0);. 
172f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17300 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17310 42 79 74 65 73 2c 20 26 62 79 74 65 73 29 20 29  Bytes, &bytes) )
17320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17330 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17340 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70  e3_bind_text16(p
17350 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64  Stmt, idx, (void
17360 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c   *)value, bytes,
17370 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71   xDel);.  if( sq
17380 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17390 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
173a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
173b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
173c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
173d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
173e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
173f0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73  terp, sqlite3Tes
17400 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
17410 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17420 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
17430 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17440 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
17450 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17460 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17470 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17480 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d  ob ?-static? STM
17490 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a  T N DATA BYTES.*
174a0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
174b0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
174c0 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
174d0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
174e0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
174f0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
17500 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
17510 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
17520 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
17530 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c  nd.** binds a BL
17540 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
17550 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73  rd.  The BLOB is
17560 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e 20   BYTES bytes in 
17570 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
17580 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c  int test_bind_bl
17590 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
175a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
175b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
175c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
175d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
175e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
175f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17600 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
17610 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
17620 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
17630 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63 74  sqlite3_destruct
17640 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72 75 63  or_type xDestruc
17650 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54 52 41  tor = SQLITE_TRA
17660 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f  NSIENT;..  if( o
17670 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
17680 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  6 ){.    Tcl_App
17690 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
176a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
176b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
176c0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
176d0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
176e0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
176f0 20 4e 20 44 41 54 41 20 42 59 54 45 53 22 2c 20   N DATA BYTES", 
17700 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17720 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
17730 20 20 20 20 78 44 65 73 74 72 75 63 74 6f 72 20      xDestructor 
17740 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3b  = SQLITE_STATIC;
17750 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d  .    objv++;.  }
17760 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17790 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
177a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
177b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
177c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
177d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
177e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
177f0 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
17800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17810 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[3]);.  if( Tc
17820 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17830 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
17840 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
17850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17860 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
17870 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  d_blob(pStmt, id
17880 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c  x, value, bytes,
17890 20 78 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   xDestructor);. 
178a0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
178b0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
178c0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
178d0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
178e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
178f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17900 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17910 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
17920 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17930 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
17940 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
17950 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54  eter_count  STMT
17960 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17970 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69 6c 64  e number of wild
17980 63 61 72 64 73 20 69 6e 20 74 68 65 20 67 69 76  cards in the giv
17990 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  en statement..*/
179a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
179b0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
179c0 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
179d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
179e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
179f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17a00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17a10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17a20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
17a30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
17a40 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17a50 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17a60 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
17a70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17a80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17a90 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
17aa0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
17ab0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17ac0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17ad0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
17ae0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
17af0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
17b00 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  tObj(sqlite3_bin
17b10 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17b20 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
17b30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17b40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17b50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
17b60 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54  meter_name  STMT
17b70 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e    N.**.** Return
17b80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17b90 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e 20 20   Nth wildcard.  
17ba0 54 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  The first wildca
17bb0 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65  rd is 1..** An e
17bc0 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
17bd0 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69 73 20  eturned if N is 
17be0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20  out of range or 
17bf0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 0a  if the wildcard.
17c00 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a  ** is nameless..
17c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17c20 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
17c30 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a  r_name(.  void *
17c40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17c50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17c60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17c70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17c80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
17c90 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
17ca0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
17cb0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
17cc0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17cd0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
17ce0 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20  , "STMT N");.   
17cf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17d00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17d10 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17d20 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17d30 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17d40 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17d50 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
17d60 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17d70 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
17d80 20 26 69 29 20 29 20 72 65 74 75 72 6e 20 54 43   &i) ) return TC
17d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
17da0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
17db0 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
17dc0 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
17dd0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17de0 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c  r_name(pStmt,i),
17df0 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  -1).  );.  retur
17e00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17e10 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17e20 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
17e30 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54 20 20  er_index  STMT  
17e40 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
17e50 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
17e60 68 65 20 77 69 6c 64 63 61 72 64 20 63 61 6c 6c  he wildcard call
17e70 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e  ed NAME.  Return
17e80 20 30 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a   0 if there is.*
17e90 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64 63 61  * no such wildca
17ea0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
17eb0 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
17ec0 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76  meter_index(.  v
17ed0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17ee0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17ef0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17f00 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17f10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17f20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17f30 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
17f40 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
17f50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17f60 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17f70 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20  TMT NAME");.    
17f80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17f90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
17fa0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
17fb0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17fc0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
17fd0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17fe0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
17ff0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18000 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49  , .     Tcl_NewI
18010 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71  ntObj(.       sq
18020 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
18030 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74  eter_index(pStmt
18040 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  ,Tcl_GetString(o
18050 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a  bjv[2])).     ).
18060 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
18070 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18080 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18090 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53  clear_bindings S
180a0 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  TMT.**.*/.static
180b0 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72 5f   int test_clear_
180c0 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64  bindings(.  void
180d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
180e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
180f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18100 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18110 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18120 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18130 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
18140 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
18150 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
18160 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
18170 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
18180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18190 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
181a0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
181b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
181c0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
181d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
181e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
181f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18200 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
18210 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70  clear_bindings(p
18220 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
18230 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18240 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
18250 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53  te3_sleep MILLIS
18260 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63  ECONDS.*/.static
18270 20 69 6e 74 20 74 65 73 74 5f 73 6c 65 65 70 28   int test_sleep(
18280 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18290 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
182a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
182b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
182c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
182d0 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20  ){.  int ms;..  
182e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
182f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18300 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
18310 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
18320 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DS");.    return
18330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18340 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18350 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18360 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b  objv[1], &ms) ){
18370 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18380 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
18390 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
183a0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
183b0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65  Obj(sqlite3_slee
183c0 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72  p(ms)));.  retur
183d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
183e0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
183f0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
18400 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
18410 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
18420 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
18430 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18440 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
18450 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
18460 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
18470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18480 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28  test_ex_errcode(
18490 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
184a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
184b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
184c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
184d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
184e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
184f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
18500 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
18510 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18520 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18530 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18540 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18550 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18560 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
18570 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18580 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18590 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
185a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
185b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
185c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
185d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
185e0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
185f0 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  d_errcode(db);. 
18600 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18610 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
18620 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
18630 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
18640 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
18650 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18660 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
18670 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
18680 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
18690 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
186a0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
186b0 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
186c0 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
186d0 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
186e0 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63 6f  c int test_errco
186f0 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
18700 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18710 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18720 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18730 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18740 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
18750 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
18760 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18770 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18780 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18790 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
187a0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
187b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
187c0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
187d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
187e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
187f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
18800 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18810 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18820 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
18830 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
18840 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
18850 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41  ode(db);.  Tcl_A
18860 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18870 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
18880 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
18890 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
188a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
188b0 3a 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  :   sqlite3_errm
188c0 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sg DB.**.** Retu
188d0 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65  rns the UTF-8 re
188e0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
188f0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
18900 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
18910 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
18920 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
18930 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
18940 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20  t test_errmsg(. 
18950 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18960 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18970 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18980 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18990 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
189a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
189b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
189c0 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rr;..  if( objc!
189d0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
189e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
189f0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
18a00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
18a10 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
18a20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18a30 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
18a40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18a50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
18a60 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
18a70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18a80 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
18a90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18aa0 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
18ab0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
18ac0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
18ad0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
18ae0 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
18af0 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e  , -1));.  return
18b00 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18b10 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f  * Usage:   test_
18b20 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a  errmsg16 DB.**.*
18b30 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
18b40 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74 61 74  F-16 representat
18b50 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
18b60 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
18b70 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
18b80 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
18b90 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20   API call. This 
18ba0 69 73 20 61 20 62 79 74 65 20 61 72 72 61 79 20  is a byte array 
18bb0 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 54 43  object at the TC
18bc0 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64  L .** level, and
18bd0 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65   it includes the
18be0 20 30 78 30 30 20 30 78 30 30 20 74 65 72 6d 69   0x00 0x00 termi
18bf0 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74 20 74  nator bytes at t
18c00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
18c10 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a   UTF-16 string..
18c20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18c30 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76  st_errmsg16(.  v
18c40 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18c50 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18c60 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18c70 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18c80 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
18c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18ca0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
18cb0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
18cc0 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f  void *zErr;.  co
18cd0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
18ce0 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20  nt bytes = 0;.. 
18cf0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18d00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18d10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18d20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18d30 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18d40 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18d50 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
18d60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18d70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d80 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
18d90 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18da0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18db0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
18dc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
18dd0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
18de0 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66  rmsg16(db);.  if
18df0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 7a 20  ( zErr ){.    z 
18e00 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66 6f 72 28  = zErr;.    for(
18e10 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73  bytes=0; z[bytes
18e20 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b  ] || z[bytes+1];
18e30 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d   bytes+=2){}.  }
18e40 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18e50 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18e60 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
18e70 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23  zErr, bytes));.#
18e80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18e90 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
18ea0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18eb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
18ec0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44  qlite3_prepare D
18ed0 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
18ee0 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  lvar?.**.** Comp
18ef0 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
18f00 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
18f10 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
18f20 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
18f30 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18f40 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
18f50 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
18f60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
18f70 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
18f80 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
18f90 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
18fa0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
18fb0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
18fc0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
18fd0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
18fe0 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
18ff0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19000 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19010 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19020 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19030 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19040 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
19050 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
19060 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79   *zSql;.  int by
19070 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tes;.  const cha
19080 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
19090 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
190a0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
190b0 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
190c0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
190d0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
190e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
190f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19100 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19110 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19120 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19130 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
19140 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
19150 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
19160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19170 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19180 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
191a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
191b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
191c0 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
191d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
191e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
191f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19200 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
19210 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
19220 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
19230 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
19240 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
19250 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
19260 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
19270 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
19280 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
19290 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
192a0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
192b0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
192c0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61  ERROR;.  if( zTa
192d0 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
192e0 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
192f0 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
19300 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69   = bytes - (zTai
19310 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
19320 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54     if( strlen(zT
19330 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20  ail)<bytes ){.  
19340 20 20 20 20 62 79 74 65 73 20 3d 20 73 74 72 6c      bytes = strl
19350 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d  en(zTail);.    }
19360 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
19370 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
19380 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
19390 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
193a0 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
193b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
193c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
193d0 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
193e0 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
193f0 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
19400 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19410 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
19420 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
19430 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
19440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19450 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
19460 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
19470 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
19480 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
19490 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
194a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
194b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
194c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
194d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
194e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
194f0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19500 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42  e3_prepare_v2 DB
19510 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
19520 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
19530 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
19540 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
19550 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
19560 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
19570 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19580 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
19590 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
195a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
195b0 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
195c0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
195d0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
195e0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
195f0 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
19600 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
19610 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
19620 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19630 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
19640 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19650 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19660 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19670 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19680 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19690 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
196a0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
196b0 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
196c0 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
196d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
196e0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
196f0 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
19700 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
19710 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
19720 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19730 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19740 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19750 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19760 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19770 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19780 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
19790 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
197a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
197b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
197c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
197d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
197e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
197f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19800 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
19810 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
19820 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
19830 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19840 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
19850 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
19860 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
19870 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
19880 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  2(db, zSql, byte
19890 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
198a0 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
198b0 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ;.  assert(rc==S
198c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
198d0 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73  t==0);.  Tcl_Res
198e0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
198f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
19900 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
19910 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
19920 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19930 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62   if( zTail && ob
19940 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
19950 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
19960 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
19970 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b   - (zTail-zSql);
19980 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
19990 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
199a0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
199b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
199c0 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
199d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
199e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
199f0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
19a00 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
19a10 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
19a20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
19a30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19a40 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
19a50 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
19a60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19a70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19a80 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
19a90 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
19aa0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
19ab0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
19ac0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19ad0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
19ae0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19af0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
19b00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19b20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19b30 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a  _tkt3134 DB.**.*
19b40 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72 65  * Generate a pre
19b50 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
19b60 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20  for a zero-byte 
19b70 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73 74  string as a test
19b80 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23  .** for ticket #
19b90 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e  3134.  The strin
19ba0 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63  g should be prec
19bb0 65 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  eeded by a zero 
19bc0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
19bd0 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19be0 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
19bf0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19c00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19c10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19c20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19c30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19c40 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
19c50 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
19c60 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
19c70 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
19c80 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19c90 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19ca0 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19cb0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19cc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19cd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19ce0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19cf0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19d00 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19d10 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
19d20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
19d30 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
19d40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19d50 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19d60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19d70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19d80 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19d90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19da0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19db0 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
19dc0 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
19dd0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
19de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
19df0 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
19e00 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19e10 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19e20 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
19e30 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
19e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19e50 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
19e60 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
19e70 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
19e80 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
19e90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19ea0 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
19eb0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
19ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19ed0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19ee0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
19ef0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
19f00 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
19f10 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
19f20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19f30 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
19f40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19f50 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
19f60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19f80 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
19f90 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73  e16 DB sql bytes
19fa0 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
19fb0 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
19fc0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
19fd0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
19fe0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
19ff0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1a000 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1a010 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1a020 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1a030 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1a040 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1a050 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1a060 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1a070 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1a080 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1a090 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1a0a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1a0b0 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
1a0c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a0d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a0e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1a0f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1a100 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1a110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1a120 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1a130 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1a140 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1a150 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1a160 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1a170 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1a180 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1a190 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a1a0 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1a1b0 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1a1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a1d0 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1a1e0 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1a1f0 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a210 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1a220 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1a230 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a240 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a250 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a260 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a270 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a280 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a290 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a2a0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a2b0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1a2c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a2d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a2e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1a2f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1a300 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1a310 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1a320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1a330 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1a340 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1a350 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1a360 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a370 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a380 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1a390 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a3a0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1a3b0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
1a3c0 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1a3d0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a3e0 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a3f0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a400 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a410 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1a420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a430 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1a440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a450 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1a460 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1a470 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1a480 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75  n = objlen - ((u
1a490 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1a4a0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1a4b0 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1a4c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1a4d0 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1a4e0 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1a4f0 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1a500 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1a510 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1a520 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1a530 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1a540 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1a550 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1a560 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1a570 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1a580 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1a590 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1a5a0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1a5b0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1a5c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a5d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a5e0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a5f0 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1a600 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a610 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1a620 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a630 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1a640 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20  are16_v2 DB sql 
1a650 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1a660 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1a670 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1a680 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1a690 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1a6a0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1a6b0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1a6c0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1a6d0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1a6e0 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1a6f0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1a700 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1a710 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1a720 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1a730 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1a740 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1a750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a760 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
1a770 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a780 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a790 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a7a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a7b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a7c0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1a7d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1a7e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1a7f0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1a800 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1a810 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1a820 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1a830 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a840 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1a850 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1a860 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1a870 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1a880 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1a890 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1a8a0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1a8b0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1a8c0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1a8d0 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1a8e0 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1a8f0 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1a900 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1a910 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a920 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a930 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a940 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1a950 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1a960 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1a970 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1a980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a990 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1a9a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1a9b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1a9c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1a9d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a9e0 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1a9f0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1aa00 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1aa10 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1aa20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1aa30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1aa40 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1aa50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1aa60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1aa70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20  repare16_v2(db, 
1aa80 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1aa90 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1aaa0 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1aab0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1aac0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1aad0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1aae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1aaf0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1ab00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1ab10 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1ab20 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1ab30 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1ab40 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a   objlen - ((u8 *
1ab50 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
1ab60 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1ab70 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b       objlen = 0;
1ab80 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c  .    }.    pTail
1ab90 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
1aba0 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
1abb0 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20  il, objlen);.   
1abc0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1abd0 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63  t(pTail);.    Tc
1abe0 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
1abf0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
1ac00 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20   pTail, 0);.    
1ac10 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1ac20 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20  (pTail);.  }..  
1ac30 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1ac40 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1ac50 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1ac60 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1ac70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1ac80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
1ac90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1aca0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1acb0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1acc0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1acd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ace0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1acf0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69   sqlite3_open fi
1ad00 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d  lename ?options-
1ad10 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  list?.*/.static 
1ad20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20  int test_open(. 
1ad30 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ad40 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ad50 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ad60 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ad70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1ad80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ad90 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
1ada0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1adb0 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
1adc0 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1add0 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26  !=3 && objc!=2 &
1ade0 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
1adf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ae00 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ae10 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ae20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ae30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ae40 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
1ae50 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
1ae60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ae70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ae80 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f  .  zFilename = o
1ae90 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53  bjc>1 ? Tcl_GetS
1aea0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a  tring(objv[1]) :
1aeb0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
1aec0 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  e3_open(zFilenam
1aed0 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
1aee0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1aef0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1af00 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1af10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1af20 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1af30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1af40 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1af50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1af60 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1af70 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
1af80 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
1af90 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31  c int test_open1
1afa0 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1afb0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1afc0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1afd0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1afe0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1aff0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1b000 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1b010 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1b020 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1b030 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1b040 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1b050 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1b060 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1b070 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b080 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b090 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b0a0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b0b0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b0c0 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
1b0d0 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
1b0e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b0f0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
1b100 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
1b110 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1b120 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63  bjv[1], 0);.  rc
1b130 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31   = sqlite3_open1
1b140 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
1b150 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
1b160 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1b170 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1b180 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
1b190 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1b1a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b1b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1b1c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b1d0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1b1e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b1f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b200 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1b210 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69  e16 <UTF-16 stri
1b220 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ng>.**.** Return
1b230 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69   1 if the suppli
1b240 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ed argument is a
1b250 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
1b260 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f  atement, or zero
1b270 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1b280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1b290 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20  t_complete16(.  
1b2a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b2b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b2c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b2d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1b2e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1b2f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b300 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
1b310 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
1b320 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b330 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ).  char *zBuf;.
1b340 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1b350 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b360 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b370 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36  , objv, "<utf-16
1b380 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74   sql>");.    ret
1b390 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b3a0 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68   }..  zBuf = (ch
1b3b0 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
1b3c0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1b3d0 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  [1], 0);.  Tcl_S
1b3e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1b3f0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1b400 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  j(sqlite3_comple
1b410 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65  te16(zBuf)));.#e
1b420 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b430 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20  MIT_COMPLETE && 
1b440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b450 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1b460 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b470 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
1b480 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
1b490 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
1b4a0 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
1b4b0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1b4c0 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20  nt test_step(.  
1b4d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b4e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b4f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b500 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1b510 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1b520 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b530 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
1b540 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1b550 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1b560 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b570 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1b580 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1b590 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1b5a0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1b5b0 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
1b5c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b5d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1b5e0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1b5f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b600 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1b610 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1b620 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1b630 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1b640 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21  );..  /* if( rc!
1b650 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
1b660 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
1b670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b680 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52  R; */.  Tcl_SetR
1b690 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1b6a0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1b6b0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1b6c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1b6d0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1b6e0 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ql(.  void * cli
1b6f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b700 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b710 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b720 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b730 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1b740 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1b750 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1b760 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b770 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b780 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
1b790 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b7a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1b7b0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1b7c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1b7d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1b7e0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1b7f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1b800 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1b810 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1b820 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43  3_sql(pStmt), TC
1b830 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72  L_VOLATILE);.  r
1b840 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b850 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b860 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
1b870 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
1b880 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1b890 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
1b8a0 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
1b8b0 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
1b8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b8d0 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
1b8e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b8f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b900 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b910 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b920 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b930 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1b940 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1b950 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1b960 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b970 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1b980 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1b990 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1b9a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b9b0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1b9c0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1b9d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b9e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1b9f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1ba00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ba10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1ba20 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1ba30 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1ba40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ba50 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1ba60 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
1ba70 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1ba80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ba90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1baa0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1bab0 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
1bac0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1bad0 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
1bae0 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1baf0 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1bb00 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
1bb10 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1bb20 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
1bb30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1bb40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1bb50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1bb60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1bb70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1bb80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1bb90 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1bba0 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
1bbb0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1bbc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bbd0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1bbe0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1bbf0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1bc00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bc10 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1bc20 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1bc30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bc40 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1bc50 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1bc60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1bc70 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1bc80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1bc90 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1bca0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1bcb0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1bcc0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1bcd0 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
1bce0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1bcf0 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
1bd00 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
1bd10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bd20 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
1bd30 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1bd40 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
1bd50 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1bd60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bd70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1bd80 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
1bd90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1bda0 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
1bdb0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1bdc0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1bdd0 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
1bde0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1bdf0 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
1be00 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1be10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1be20 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
1be30 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1be40 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
1be50 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1be60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1be70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
1be80 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
1be90 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1bea0 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
1beb0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1bec0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1bed0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
1bee0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1bef0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1bf00 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1bf10 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
1bf20 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1bf30 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1bf40 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1bf50 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1bf60 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
1bf70 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
1bf80 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1bf90 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1bfa0 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
1bfb0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1bfc0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1bfd0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1bfe0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1bff0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c000 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c010 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1c020 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
1c030 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c040 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c050 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c060 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c070 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c080 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c090 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1c0a0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1c0b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c0c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1c0d0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1c0e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c0f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1c100 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1c110 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1c120 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1c130 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1c140 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1c150 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
1c160 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1c170 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1c180 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
1c190 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1c1a0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
1c1b0 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
1c1c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c1d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c1e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
1c1f0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1c200 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1c210 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
1c220 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c230 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c240 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c250 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c260 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c270 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c280 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1c290 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
1c2a0 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
1c2b0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1c2c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c2d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c2e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c2f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1c300 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c310 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1c320 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1c330 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c340 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c350 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1c360 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c370 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c380 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1c390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c3a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c3b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c3c0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1c3d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c3e0 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ..  len = sqlite
1c3f0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1c400 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42  Stmt, col);.  pB
1c410 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
1c420 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1c430 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1c440 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c450 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
1c460 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
1c470 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1c480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1c490 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1c4a0 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
1c4b0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
1c4c0 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
1c4d0 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1c4e0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1c4f0 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
1c500 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1c510 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
1c520 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
1c530 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c540 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c550 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c560 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c570 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1c580 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1c590 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
1c5a0 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
1c5b0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c5c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c5d0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c5e0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c5f0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c600 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c610 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1c620 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1c630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c640 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1c650 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1c660 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c670 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1c680 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1c690 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1c6a0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1c6b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1c6c0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1c6d0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
1c6e0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1c6f0 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
1c700 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1c710 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c720 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
1c730 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
1c740 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c750 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c760 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
1c770 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1c780 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c790 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1c7a0 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1c7b0 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1c7c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
1c7d0 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
1c7e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c7f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c800 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c810 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c820 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c830 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c840 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1c850 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c860 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c870 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c880 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c890 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c8a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c8b0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c8c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c8d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c8e0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c8f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c900 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c910 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c920 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c930 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1c940 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c950 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1c960 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
1c970 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
1c980 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c990 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c9a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
1c9b0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1c9c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c9d0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
1c9e0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1c9f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1ca00 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
1ca10 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1ca20 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
1ca30 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
1ca40 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
1ca50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
1ca60 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
1ca70 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
1ca80 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1ca90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1caa0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1cab0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1cac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1cad0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1cae0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1caf0 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1cb00 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20  _stmt*, int);.  
1cb10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
1cb20 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
1cb30 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71  nst char *(*)(sq
1cb40 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1cb50 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
1cb60 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1cb70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1cb80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1cb90 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1cba0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1cbb0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1cbc0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1cbd0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1cbe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1cbf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1cc00 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1cc10 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1cc20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1cc30 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1cc40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1cc50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1cc60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1cc70 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1cc80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1cc90 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  Ret = xFunc(pStm
1cca0 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
1ccb0 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ret ){.    Tcl_S
1ccc0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1ccd0 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30   (char *)zRet, 0
1cce0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ccf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1cd00 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61  c int test_globa
1cd10 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69  l_recover(.  voi
1cd20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1cd30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cd40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cd50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cd60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1cd70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cd80 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e  _DEPRECATED.  in
1cd90 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
1cda0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
1cdb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1cdc0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
1cdd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1cde0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
1cdf0 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61   = sqlite3_globa
1ce00 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54  l_recover();.  T
1ce10 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ce20 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1ce30 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1ce40 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
1ce50 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1ce60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ce70 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1ce80 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1ce90 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1cea0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1ceb0 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1cec0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1ced0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1cee0 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1cef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cf00 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
1cf10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1cf20 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
1cf30 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1cf40 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1cf50 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1cf60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cf70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cf80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1cf90 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1cfa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1cfb0 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
1cfc0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1cfd0 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
1cfe0 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
1cff0 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
1d000 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
1d010 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1d020 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
1d030 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
1d040 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
1d050 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
1d060 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
1d070 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d080 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d090 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d0a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d0b0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d0c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d0d0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d0e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d0f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d100 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d110 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d120 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d130 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d150 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d160 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d170 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d180 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d190 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d  OR;..  zName16 =
1d1a0 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1d1b0 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31  l);.  if( zName1
1d1c0 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  6 ){.    int n;.
1d1d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d1e0 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20  z = zName16;.   
1d1f0 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c   for(n=0; z[n] |
1d200 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b  | z[n+1]; n+=2){
1d210 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c  }.    pRet = Tcl
1d220 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1d230 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a  (zName16, n+2);.
1d240 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1d250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1d260 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  t);.  }.#endif /
1d270 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1d280 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  F16 */..  return
1d290 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d2a0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d2b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54  _column_int STMT
1d2c0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1d2d0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1d2e0 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63  umn_bytes STMT c
1d2f0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1d300 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d310 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63  n_bytes16 STMT c
1d320 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  olumn.**.*/.stat
1d330 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1d340 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
1d350 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a  lientData,    /*
1d360 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
1d370 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
1d380 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
1d390 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d3a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d3b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d3c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d3d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d3e0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1d3f0 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73    int (*xFunc)(s
1d400 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1d410 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1d420 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f  int (*)(sqlite3_
1d430 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1d440 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1d450 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d460 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d470 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d480 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d490 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d4a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d4b0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d4c0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d4d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d4e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d4f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d500 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d510 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d520 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d530 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1d540 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d550 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1d560 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1d570 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1d580 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d590 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1d5a0 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
1d5b0 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
1d5c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d5d0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73  Usage:  sqlite_s
1d5e0 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41  et_magic  DB  MA
1d5f0 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a  GIC-NUMBER.**.**
1d600 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67   Set the db->mag
1d610 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ic value.  This 
1d620 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
1d630 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c  error recovery l
1d640 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
1d650 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  int sqlite_set_m
1d660 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  agic(.  void * c
1d670 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d680 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d690 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1d6a0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1d6b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1d6c0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1d6d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d6e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d6f0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d700 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1d710 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20  ,.         " DB 
1d720 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20  MAGIC", 0);.    
1d730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1d750 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1d760 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1d770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d780 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
1d790 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1d7a0 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30  _MAGIC_OPEN")==0
1d7b0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1d7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1d7d0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
1d7e0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1d7f0 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1d800 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a  _CLOSED")==0 ){.
1d810 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1d820 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1d830 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
1d840 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1d850 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42   "SQLITE_MAGIC_B
1d860 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  USY")==0 ){.    
1d870 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1d880 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
1d890 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1d8a0 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1d8b0 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29  TE_MAGIC_ERROR")
1d8c0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1d8d0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1d8e0 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  GIC_ERROR;.  }el
1d8f0 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  se if( Tcl_GetIn
1d900 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
1d910 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61  ], (int*)&db->ma
1d920 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gic) ){.    retu
1d930 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d940 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1d950 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d960 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  e:  sqlite3_inte
1d970 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a  rrupt  DB .**.**
1d980 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65   Trigger an inte
1d990 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73  rrupt on DB.*/.s
1d9a0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69  tatic int test_i
1d9b0 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64  nterrupt(.  void
1d9c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1d9d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d9e0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1d9f0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1da00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1da10 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1da20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1da30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1da40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1da50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1da60 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b  v[0], " DB", 0);
1da70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1da80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1da90 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1daa0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1dab0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1dac0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
1dad0 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b  3_interrupt(db);
1dae0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1daf0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a  ;.}..static u8 *
1db00 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1db10 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  seline = 0;../*.
1db20 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63  ** Fill the stac
1db30 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62  k with a known b
1db40 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74  itpattern..*/.st
1db50 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53 74  atic void prepSt
1db60 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ack(void){.  int
1db70 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66   i;.  u32 bigBuf
1db80 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69  [65536];.  for(i
1db90 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67  =0; i<sizeof(big
1dba0 42 75 66 29 3b 20 69 2b 2b 29 20 62 69 67 42 75  Buf); i++) bigBu
1dbb0 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65  f[i] = 0xdeadbee
1dbc0 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  f;.  sqlite3_sta
1dbd0 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75  ck_baseline = (u
1dbe0 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33 36  8*)&bigBuf[65536
1dbf0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ];.}../*.** Get 
1dc00 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63  the current stac
1dc10 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64 20 66  k depth.  Used f
1dc20 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
1dc30 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  y..*/.u64 sqlite
1dc40 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64  3StackDepth(void
1dc50 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74  ){.  u8 x;.  ret
1dc60 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65  urn (u64)(sqlite
1dc70 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1dc80 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   - &x);.}../*.**
1dc90 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1dca0 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53  _stack_used DB S
1dcb0 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  QL.**.** Try to 
1dcc0 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75  measure the amou
1dcd0 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63  nt of stack spac
1dce0 65 20 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c  e used by a call
1dcf0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
1dd00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1dd10 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a  est_stack_used(.
1dd20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1dd30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1dd40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1dd50 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1dd60 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1dd70 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  3 *db;.  int i;.
1dd80 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1dd90 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1dda0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1ddb0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1ddc0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1ddd0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1dde0 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
1ddf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1de00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1de10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1de20 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1de30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1de40 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28  OR;.  prepStack(
1de50 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  );.  (void)sqlit
1de60 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76  e3_exec(db, argv
1de70 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  [2], 0, 0, 0);. 
1de80 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e   for(i=65535; i>
1de90 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c  =0 && ((u32*)sql
1dea0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1deb0 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64  ine)[-i]==0xdead
1dec0 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54  beef; i--){}.  T
1ded0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1dee0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1def0 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72  ntObj(i*4));.  r
1df00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1df10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1df20 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
1df30 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e  tion DB function
1df40 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
1df50 74 65 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  te the user func
1df60 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e  tion 'function-n
1df70 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
1df80 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74  se handle DB. It
1df90 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74  .** is assumed t
1dfa0 68 61 74 20 74 68 65 20 75 73 65 72 20 66 75 6e  hat the user fun
1dfb0 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65  ction was create
1dfc0 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e  d as UTF8, any n
1dfd0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75  umber of.** argu
1dfe0 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79 20 74  ments (the way t
1dff0 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1e000 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
1e010 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f  atic int delete_
1e020 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64  function(.  void
1e030 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e040 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e050 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1e060 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1e070 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1e080 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1e090 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1e0a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e0b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e0c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e0d0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e0e0 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75  .        " DB fu
1e0f0 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29  nction-name", 0)
1e100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e110 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1e120 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1e130 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1e140 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1e150 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1e160 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1e170 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  unction(db, argv
1e180 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [2], -1, SQLITE_
1e190 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  UTF8, 0, 0, 0, 0
1e1a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1e1b0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1e1c0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1e1d0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1e1e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e200 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f  : sqlite_delete_
1e210 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c  collation DB col
1e220 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  lation-name.**.*
1e230 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c  * Delete the col
1e240 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1e250 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27  'collation-name'
1e260 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1e270 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74  andle .** DB. It
1e280 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1e290 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e2a0 65 71 75 65 6e 63 65 20 77 61 73 20 63 72 65 61  equence was crea
1e2b0 74 65 64 20 61 73 20 55 54 46 38 20 28 74 68 65  ted as UTF8 (the
1e2c0 20 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c   .** way the TCL
1e2d0 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
1e2e0 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  it)..*/.static i
1e2f0 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  nt delete_collat
1e300 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1e310 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e320 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e330 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1e340 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1e350 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1e360 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1e370 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1e380 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e390 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e3a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e3b0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1e3c0 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1e3d0 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1e3e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e3f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1e400 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1e410 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1e420 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e430 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1e440 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1e450 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1e460 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1e470 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
1e480 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e490 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
1e4a0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
1e4b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e4c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e4d0 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  ge: sqlite3_get_
1e4e0 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a  autocommit DB.**
1e4f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1e500 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e510 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  DB is currently 
1e520 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d  in auto-commit m
1e530 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ode..** Return f
1e540 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
1e550 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61  static int get_a
1e560 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69  utocommit(.  voi
1e570 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1e580 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e590 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1e5a0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1e5b0 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ){.  char zBuf[3
1e5c0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  0];.  sqlite3 *d
1e5d0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
1e5e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e5f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e600 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e610 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1e620 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1e630 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1e640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1e660 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1e670 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1e680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e690 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  R;.  sprintf(zBu
1e6a0 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33  f, "%d", sqlite3
1e6b0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1e6c0 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  db));.  Tcl_Appe
1e6d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e6e0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1e6f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e700 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e710 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
1e720 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74   DB MS.**.** Set
1e730 20 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75   the busy timeou
1e740 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  t.  This is more
1e750 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69   easily done usi
1e760 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a  ng the timeout.*
1e770 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
1e780 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  TCL interface.  
1e790 42 75 74 20 77 65 20 6e 65 65 64 20 61 20 77 61  But we need a wa
1e7a0 79 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  y to test the ca
1e7b0 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72  se.** where it r
1e7c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49  eturns SQLITE_MI
1e7d0 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SUSE..*/.static 
1e7e0 69 6e 74 20 74 65 73 74 5f 62 75 73 79 5f 74 69  int test_busy_ti
1e7f0 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20  meout(.  void * 
1e800 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e810 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e820 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1e830 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1e840 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73   int rc, ms;.  s
1e850 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1e860 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1e870 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e880 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e890 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e8a0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e8b0 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c   .        " DB",
1e8c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e8d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e8e0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e8f0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e900 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e910 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1e920 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1e930 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d  erp, argv[2], &m
1e940 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1e950 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1e960 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
1e970 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63  ut(db, ms);.  Tc
1e980 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e990 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65  nterp, sqlite3Te
1e9a0 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
1e9b0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1e9c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e9d0 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61  sage:  tcl_varia
1e9e0 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c  ble_type VARIABL
1e9f0 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ENAME.**.** Retu
1ea00 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
1ea10 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
1ea20 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
1ea30 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  he.** value of t
1ea40 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c  he given variabl
1ea50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ea60 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
1ea70 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1ea80 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ea90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1eaa0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1eab0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1eac0 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  [].){.  Tcl_Obj 
1ead0 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a  *pVar;.  if( obj
1eae0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1eaf0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1eb00 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56  erp, 1, objv, "V
1eb10 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72  ARIABLE");.    r
1eb20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1eb30 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63  .  }.  pVar = Tc
1eb40 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
1eb50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1eb60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54  g(objv[1]), 0, T
1eb70 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47  CL_LEAVE_ERR_MSG
1eb80 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30  );.  if( pVar==0
1eb90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1eba0 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d  ROR;.  if( pVar-
1ebb0 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20  >typePtr ){.    
1ebc0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ebd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1ebe0 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e  StringObj(pVar->
1ebf0 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d  typePtr->name, -
1ec00 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  1));.  }.  retur
1ec10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ec20 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1ec30 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
1ec40 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65  y ?N?.**.** Atte
1ec50 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  mpt to release m
1ec60 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20  emory currently 
1ec70 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74  held but not act
1ec80 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  ually required..
1ec90 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e  ** The integer N
1eca0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ecb0 66 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74  f bytes we are t
1ecc0 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65  rying to release
1ecd0 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72  .  The .** retur
1ece0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61  n value is the a
1ecf0 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1ed00 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  actually release
1ed10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1ed20 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
1ed30 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  mory(.  void * c
1ed40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ed50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ed60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ed70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1ed80 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69  jv[].){.#if defi
1ed90 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1eda0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1edb0 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  ENT) && !defined
1edc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
1edd0 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20  KIO).  int N;.  
1ede0 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
1edf0 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1ee00 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1ee10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ee20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1ee30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ee40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ee50 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
1ee60 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1ee70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1ee80 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1ee90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1eea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20  .  }else{.    N 
1eeb0 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  = -1;.  }.  amt 
1eec0 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  = sqlite3_releas
1eed0 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54  e_memory(N);.  T
1eee0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1eef0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1ef00 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e  ntObj(amt));.#en
1ef10 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1ef20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ef30 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f  age:  sqlite3_so
1ef40 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e  ft_heap_limit ?N
1ef50 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72  ?.**.** Query or
1ef60 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   set the soft he
1ef70 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65  ap limit for the
1ef80 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
1ef90 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69    The.** limit i
1efa0 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
1efb0 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65  f the N is prese
1efc0 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75  nt.  The previou
1efd0 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65  s limit.** is re
1efe0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1eff0 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f  c int test_soft_
1f000 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f  heap_limit(.  vo
1f010 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f020 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f030 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f040 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f050 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f060 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d  sqlite3_int64 am
1f070 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t;.  sqlite3_int
1f080 36 34 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28  64 N = -1;.  if(
1f090 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63   objc!=1 && objc
1f0a0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1f0b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1f0c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e  rp, 1, objv, "?N
1f0d0 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
1f0e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f0f0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
1f100 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57      if( Tcl_GetW
1f110 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
1f120 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1f130 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1f140 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74  ERROR;.  }.  amt
1f150 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f   = sqlite3_soft_
1f160 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b  heap_limit64(N);
1f170 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1f180 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1f190 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d  NewWideIntObj(am
1f1a0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
1f1b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f1c0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1f1d0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a  thread_cleanup.*
1f1e0 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
1f1f0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1f200 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  anup API..*/.sta
1f210 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72  tic int test_thr
1f220 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
1f230 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f240 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f250 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f260 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f270 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1f280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f290 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
1f2a0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1f2b0 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66  leanup();.#endif
1f2c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f2e0 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  :   sqlite3_page
1f2f0 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a  r_refcounts  DB.
1f300 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  **.** Return a l
1f310 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77  ist of numbers w
1f320 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67  hich are the Pag
1f330 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61  erRefcount for a
1f340 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20  ll.** pagers on 
1f350 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f  each database co
1f360 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1f370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67  tic int test_pag
1f380 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20  er_refcounts(.  
1f390 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f3a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f3b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1f3c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1f3d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1f3e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f3f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c   int i;.  int v,
1f400 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   *a;.  Tcl_Obj *
1f410 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20  pResult;..  if( 
1f420 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f430 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f440 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f450 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f460 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
1f470 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1f480 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1f490 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f4a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f4b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f4c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f4d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f4e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1f4f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f500 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c  .  pResult = Tcl
1f510 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72  _NewObj();.  for
1f520 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1f530 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1f540 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
1f550 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31   ){.      v = -1
1f560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f570 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1f580 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1f590 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c  );.      a = sql
1f5a0 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 73  ite3PagerStats(s
1f5b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1f5c0 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
1f5d0 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30  );.      v = a[0
1f5e0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
1f5f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f600 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
1f610 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1f620 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
1f630 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49  Result, Tcl_NewI
1f640 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20  ntObj(v));.  }. 
1f650 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1f660 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
1f670 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
1f680 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
1f690 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67  clcmd:   working
1f6a0 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a  _64bit_int.**.**
1f6b0 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73   Some TCL builds
1f6c0 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f   (ex: cygwin) do
1f6d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d   not support 64-
1f6e0 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54  bit integers.  T
1f6f0 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20  his.** leads to 
1f700 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74  a number of test
1f710 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20   failures.  The 
1f720 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20  present command 
1f730 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43  checks the.** TC
1f740 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77  L build to see w
1f750 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
1f760 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74   supports 64-bit
1f770 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a   integers.  It.*
1f780 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69  * returns TRUE i
1f790 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41  f it does and FA
1f7a0 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  LSE if not..**.*
1f7b0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  * This command i
1f7c0 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75  s used to warn u
1f7d0 73 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20  sers that their 
1f7e0 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66  TCL build is def
1f7f0 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68  ective.** and th
1f800 61 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68  at the errors th
1f810 65 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e  ey are seeing in
1f820 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74   the test script
1f830 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  s might be.** a 
1f840 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20  result of their 
1f850 64 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61  defective TCL ra
1f860 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65  ther than proble
1f870 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  ms in SQLite..*/
1f880 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b  .static int work
1f890 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20  ing_64bit_int(. 
1f8a0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1f8b0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1f8c0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1f8d0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1f8e0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1f8f0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1f900 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1f910 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1f920 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1f930 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1f940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f950 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1f960 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1f970 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1f980 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1f990 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  ts */.){.  Tcl_O
1f9a0 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20  bj *pTestObj;.  
1f9b0 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b  int working = 0;
1f9c0 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54  ..  pTestObj = T
1f9d0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1f9e0 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32  (1000000*(i64)12
1f9f0 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72  34567890);.  wor
1fa00 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63  king = strcmp(Tc
1fa10 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73  l_GetString(pTes
1fa20 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38  tObj), "12345678
1fa30 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20  90000000")==0;. 
1fa40 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1fa50 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54  t(pTestObj);.  T
1fa60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1fa70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1fa80 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e  ooleanObj(workin
1fa90 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  g));.  return TC
1faa0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1fab0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
1fac0 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  link_test.**.** 
1fad0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1fae0 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65   unregisters the
1faf0 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64   primary VFS and
1fb00 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a   then registers.
1fb10 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ** it back again
1fb20 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1fb30 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c  to test the abil
1fb40 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20  ity to register 
1fb50 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f  a.** VFS when no
1fb60 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c  ne are previousl
1fb70 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e  y registered, an
1fb80 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  d the ability to
1fb90 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20   .** unregister 
1fba0 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  the only availab
1fbb0 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20  le VFS.  Ticket 
1fbc0 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20  #2738.*/.static 
1fbd0 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74  int vfs_unlink_t
1fbe0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
1fbf0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1fc00 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1fc10 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1fc20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1fc30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fc40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1fc50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1fc60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1fc70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1fc80 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1fc90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1fca0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1fcb0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1fcc0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1fcd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1fce0 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
1fcf0 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20  3_vfs *pMain;.  
1fd00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
1fd10 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65  fs[20];.  sqlite
1fd20 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a  3_vfs one, two;.
1fd30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
1fd40 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20  nregister(0);   
1fd50 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66  /* Unregister of
1fd60 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73   NULL is harmles
1fd70 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  s */.  one.zName
1fd80 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77   = "__one";.  tw
1fd90 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f  o.zName = "__two
1fda0 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  ";..  /* Calling
1fdb0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1fdc0 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61  ister with 2nd a
1fdd0 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65  rgument of 0 doe
1fde0 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67  s not.  ** chang
1fdf0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  e the default VF
1fe00 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d  S.  */.  pMain =
1fe10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1fe20 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  d(0);.  sqlite3_
1fe30 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
1fe40 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 0);.  assert(
1fe50 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
1fe60 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
1fe70 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c  find(0) );.  sql
1fe80 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1fe90 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73  r(&two, 0);.  as
1fea0 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
1feb0 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
1fec0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1fed0 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e  .  /* We can fin
1fee0 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e  d a VFS by its n
1fef0 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ame */.  assert(
1ff00 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1ff10 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
1ff20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1ff30 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1ff40 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
1ff50 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
1ff60 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74  qlite_vfs_regist
1ff70 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f  er with non-zero
1ff80 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1ff90 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20  r changes the.  
1ffa0 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20  ** default VFS, 
1ffb0 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20  even if the 1st 
1ffc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
1ffd0 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74  existig VFS that
1ffe0 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75   is.  ** previou
1fff0 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61  sly registered a
20000 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c  s the non-defaul
20010 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
20020 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
20030 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  one, 1);.  asser
20040 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20050 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
20060 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
20070 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20080 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
20090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
200a0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
200b0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69  ==&one );.  sqli
200c0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
200d0 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73  (&two, 1);.  ass
200e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
200f0 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
20100 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
20110 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20120 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
20130 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
20140 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20150 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66  0)==&two );.  if
20160 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73  ( pMain ){.    s
20170 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20180 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20  ter(pMain, 1);. 
20190 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
201a0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
201b0 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
201c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
201d0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
201e0 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20  o")==&two );.   
201f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20200 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
20210 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ain );.  }.  .  
20220 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65  /* Unlink the de
20230 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65  fault VFS.  Repe
20240 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  at until there a
20250 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73  re no more VFSes
20260 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64  .  ** registered
20270 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
20280 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73  ; i<sizeof(apVfs
20290 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
202a0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  ]); i++){.    ap
202b0 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
202c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
202d0 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
202e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
202f0 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
20300 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
20310 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
20320 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
20330 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
20340 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  s[i]);.      ass
20350 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
20360 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
20370 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
20380 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
20390 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
203a0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20  find(0) );.  .  
203b0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
203c0 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d  main VFS as non-
203d0 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65  default (will be
203e0 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73   made default, s
203f0 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20  ince.  ** it'll 
20400 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  be the only one 
20410 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20  in existence).. 
20420 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
20430 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
20440 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
20450 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20460 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
20470 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65  .  /* Un-registe
20480 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61  r the main VFS a
20490 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20  gain to restore 
204a0 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73  an empty VFS lis
204b0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
204c0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d  fs_unregister(pM
204d0 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ain);.  assert( 
204e0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
204f0 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
20500 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73  Relink all VFSes
20510 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
20520 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d  r. */  .  for(i=
20530 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
20540 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31  zeof(apVfs[0])-1
20550 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
20560 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
20570 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20580 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
20590 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  fs[i], 1);.     
205a0 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
205b0 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
205c0 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20  ind(0) );.      
205d0 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
205e0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
205f0 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
20600 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
20610 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
20620 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53  r out sample VFS
20630 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
20640 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
20650 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  &one);.  sqlite3
20660 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
20670 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72  &two);..  /* Unr
20680 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53  egistering a VFS
20690 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72   that is not cur
206a0 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65  rently registere
206b0 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  d is harmless */
206c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
206d0 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
206e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
206f0 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
20700 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20710 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
20720 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ne")==0 );.  ass
20730 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
20740 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
20750 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68  0 );..  /* We sh
20760 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74  ould be left wit
20770 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
20780 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20  efault VFS back 
20790 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  as the.  ** orig
207a0 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  inal */.  assert
207b0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
207c0 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
207d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
207e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
207f0 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69  d:   vfs_initfai
20800 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  l_test.**.** Thi
20810 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74  s TCL command at
20820 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69  tempts to vfs_fi
20830 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73  nd and vfs_regis
20840 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ter when the.** 
20850 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
20860 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69  ze() interface i
20870 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20  s failing.  All 
20880 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69  calls should fai
20890 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
208a0 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
208b0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
208c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
208d0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
208e0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
208f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
20900 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
20910 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
20920 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
20930 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
20940 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
20950 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
20970 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
20980 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20990 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
209a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
209b0 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b  sqlite3_vfs one;
209c0 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22  .  one.zName = "
209d0 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73  __one";..  if( s
209e0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
209f0 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
20a00 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
20a10 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
20a20 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  ne, 0);.  if( sq
20a30 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
20a40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20a50 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
20a60 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
20a70 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c  e, 1);.  if( sql
20a80 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
20a90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20aa0 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
20ab0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  L_OK;.}../*.** S
20ac0 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74  aved VFSes.*/.st
20ad0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
20ae0 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61   *apVfs[20];.sta
20af0 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30  tic int nVfs = 0
20b00 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ;../*.** tclcmd:
20b10 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
20b20 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65  r_all.**.** Unre
20b30 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
20b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20b50 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
20b60 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
20b70 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
20b80 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
20b90 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
20ba0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
20bb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
20bc0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
20bd0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
20be0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
20bf0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
20c00 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20c10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
20c20 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
20c30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20c40 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
20c50 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
20c60 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
20c70 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70  ; i<ArraySize(ap
20c80 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Vfs); i++){.    
20c90 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
20ca0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
20cb0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
20cc0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
20cd0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20ce0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
20cf0 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20  );.  }.  nVfs = 
20d00 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  i;.  return TCL_
20d10 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
20d20 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69  md:   vfs_reregi
20d30 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52  ster_all.**.** R
20d40 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73  estore all VFSes
20d50 20 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76   that were remov
20d60 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72  ed using vfs_unr
20d70 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73  egister_all.*/.s
20d80 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65  tatic int vfs_re
20d90 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20  register_all(.  
20da0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
20db0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
20dc0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
20dd0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
20de0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
20df0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
20e00 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
20e10 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
20e20 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
20e30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
20e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20e50 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
20e60 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
20e70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
20e80 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
20e90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
20ea0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
20eb0 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  fs; i++){.    sq
20ec0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
20ed0 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d  er(apVfs[i], i==
20ee0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
20ef0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20f00 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
20f10 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44  e_control_test D
20f20 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
20f30 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
20f40 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
20f50 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
20f60 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
20f70 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
20f80 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
20f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
20fa0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28  le_control_test(
20fb0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
20fc0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
20fd0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
20fe0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
20ff0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21000 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21010 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21020 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21030 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21040 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21060 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21070 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21080 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
21090 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
210a0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
210b0 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
210c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
210d0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
210e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
210f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21100 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
21110 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
21120 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
21130 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
21140 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
21150 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
21160 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21170 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
21180 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21190 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
211a0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
211b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
211c0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
211d0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30  control(db, 0, 0
211e0 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
211f0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
21200 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73  RROR );.  rc = s
21210 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
21220 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74  rol(db, "notadat
21230 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46  abase", SQLITE_F
21240 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
21250 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
21260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
21270 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
21280 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
21290 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  l(db, "main", -1
212a0 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
212b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
212c0 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73  RROR );.  rc = s
212d0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
212e0 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20  rol(db, "temp", 
212f0 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  -1, &iArg);.  as
21300 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
21310 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74  _ERROR );..  ret
21320 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
21330 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
21340 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
21350 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a  terrno_test DB.*
21360 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
21370 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
21380 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
21390 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
213a0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
213b0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
213c0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41  of the SQLITE_LA
213d0 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a  ST_ERRNO verb..*
213e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
213f0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
21400 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
21410 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
21420 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
21430 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
21440 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
21450 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21460 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
21470 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
21480 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21490 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
214a0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
214b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
214c0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
214d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
214e0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
214f0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
21500 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
21510 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
21520 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
21530 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
21540 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
21550 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
21560 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
21570 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
21580 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
21590 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
215a0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
215b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
215c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
215d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
215e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
215f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
21600 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
21610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
21620 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
21630 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
21640 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
21650 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
21660 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
21670 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
21680 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
21690 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
216a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
216b0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
216c0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
216d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
216e0 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
216f0 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
21700 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
21710 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
21720 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
21730 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
21740 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
21750 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
21760 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
21770 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
21780 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
21790 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
217a0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44  chunksize_test D
217b0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
217c0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
217d0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
217e0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
217f0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
21800 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
21810 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
21820 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
21830 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
21840 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
21850 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
21860 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
21870 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
21880 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28  _chunksize_test(
21890 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
218a0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
218b0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
218c0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
218d0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
218e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
218f0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21900 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21910 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21920 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21940 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21950 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21960 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
21970 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
21980 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
21990 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219b0 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a  New chunk size *
219c0 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
219f0 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
21a00 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
21a10 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
21a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
21a30 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
21a40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
21a70 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
21a80 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
21a90 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
21aa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
21ab0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
21ac0 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
21ad0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21ae0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21af0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21b00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
21b10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
21b20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
21b30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
21b40 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
21b50 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
21b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21b70 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
21b80 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
21b90 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
21ba0 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
21bb0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
21bc0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
21bd0 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
21be0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20  NTL_CHUNK_SIZE, 
21bf0 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
21c00 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
21c10 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21c20 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
21c30 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
21c40 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
21c50 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
21c60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21c70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
21c90 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
21ca0 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20  _lockproxy_test 
21cb0 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69  DB PWD.**.** Thi
21cc0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
21cd0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
21ce0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
21cf0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
21d00 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
21d10 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
21d20 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
21d30 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53  OXYFILE and.** S
21d40 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
21d50 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a  OXYFILE verbs..*
21d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
21d70 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
21d80 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
21d90 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
21da0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
21db0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
21dc0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
21dd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21de0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
21df0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
21e00 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21e10 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
21e20 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
21e30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21e40 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
21e50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21e60 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
21e70 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
21e80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
21e90 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
21ea0 2a 7a 50 77 64 3b 0a 20 20 69 6e 74 20 6e 50 77  *zPwd;.  int nPw
21eb0 64 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  d;.  .  if( objc
21ec0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
21ed0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21ee0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
21ef0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
21f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21f10 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21f20 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
21f30 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57  [0], 0), " DB PW
21f40 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  D", 0);.    retu
21f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21f60 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
21f70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
21f80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21f90 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
21fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21fb0 3b 0a 20 20 7d 0a 20 20 7a 50 77 64 20 3d 20 54  ;.  }.  zPwd = T
21fc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
21fd0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50  Obj(objv[2], &nP
21fe0 77 64 29 3b 0a 20 20 0a 23 69 66 20 21 64 65 66  wd);.  .#if !def
21ff0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
22000 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22010 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
22020 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
22030 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
22040 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
22050 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
22060 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
22070 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
22080 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
22090 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
220a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
220b0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
220c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b  d(__APPLE__).  {
220d0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50  .    char *testP
220e0 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ath;.    int rc;
220f0 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79 50  .    char proxyP
22100 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20  ath[400];.    . 
22110 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72     if( sizeof(pr
22120 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30  oxyPath)<nPwd+20
22130 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
22140 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22150 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22  p, "PWD too big"
22160 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20  , (void*)0);.   
22170 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22180 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
22190 70 72 69 6e 74 66 28 70 72 6f 78 79 50 61 74 68  printf(proxyPath
221a0 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79  , "%s/test.proxy
221b0 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63  ", zPwd);.    rc
221c0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
221d0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
221e0 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
221f0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78  KPROXYFILE, prox
22200 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  yPath);.    if( 
22210 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
22220 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
22230 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
22240 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20  bj(rc)); .      
22250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
22270 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22280 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
22290 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
222a0 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50  ROXYFILE, &testP
222b0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74  ath);.    if( st
222c0 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c  rncmp(proxyPath,
222d0 74 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a  testPath,11) ){.
222e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
222f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
22300 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20  Lock proxy file 
22310 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  did not match th
22320 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61     "previously a
22350 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20  ssigned value", 
22360 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
22370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
22380 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
22390 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
223a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
223b0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
223c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
223d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
223e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
223f0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22400 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
22410 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
22420 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
22430 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
22440 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
22450 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
22460 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
22470 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
22480 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
22490 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
224a0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a  n TCL_OK;  .}...
224b0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
224c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
224d0 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20  .**.**   Return 
224e0 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61  a tcl list conta
224f0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ining the names 
22500 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65  of all registere
22510 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74  d vfs's..*/.stat
22520 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28  ic int vfs_list(
22530 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22540 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22550 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22560 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22570 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
22580 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22590 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
225a0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
225b0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
225c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
225e0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
225f0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22600 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22610 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22620 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
22630 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
22640 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
22650 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
22660 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
22670 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
22680 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
22690 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
226a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
226b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73  ;.  }.  for(pVfs
226c0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
226d0 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73  d(0); pVfs; pVfs
226e0 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pVfs->pNext){. 
226f0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
22700 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
22710 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
22720 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d  wStringObj(pVfs-
22730 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  >zName, -1));.  
22740 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
22750 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
22760 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
22770 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
22780 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
22790 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41  3_limit DB ID VA
227a0 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LUE.**.** This T
227b0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
227c0 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  the sqlite3_limi
227d0 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  t interface and.
227e0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
227f0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
22800 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
22810 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
22820 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  mit(.  ClientDat
22830 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22840 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22850 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22860 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22870 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22880 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22890 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
228a0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
228b0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
228c0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
228d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
228e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
228f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22900 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22910 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22920 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
22930 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63  int rc;.  static
22940 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
22950 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
22960 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20  ;.     int id;. 
22970 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20   } aId[] = {.   
22980 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
22990 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20  _LENGTH",       
229a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
229b0 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  MIT_LENGTH      
229c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
229d0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
229e0 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  SQL_LENGTH",    
229f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
22a00 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20  IT_SQL_LENGTH   
22a10 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
22a20 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43   "SQLITE_LIMIT_C
22a30 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20  OLUMN",         
22a40 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
22a50 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20  T_COLUMN        
22a60 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
22a70 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  "SQLITE_LIMIT_EX
22a80 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  PR_DEPTH",      
22a90 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
22aa0 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20  _EXPR_DEPTH     
22ab0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
22ac0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
22ad0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20  POUND_SELECT",  
22ae0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
22af0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
22b00 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
22b10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
22b20 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20  _OP",           
22b30 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
22b40 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20  DBE_OP          
22b50 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
22b60 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
22b70 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20  ION_ARG",       
22b80 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55   SQLITE_LIMIT_FU
22b90 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20  NCTION_ARG      
22ba0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
22bb0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
22bc0 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ED",            
22bd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
22be0 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20  ACHED           
22bf0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
22c00 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
22c10 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53  TTERN_LENGTH", S
22c20 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
22c30 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
22c40 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
22c50 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
22c60 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51  _NUMBER",     SQ
22c70 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
22c80 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20  BLE_NUMBER      
22c90 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
22ca0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
22cb0 45 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c  EPTH",       SQL
22cc0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
22cd0 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d  R_DEPTH        }
22ce0 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75  ,.    .    /* Ou
22cf0 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20  t of range test 
22d00 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22  cases */.    { "
22d10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
22d20 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20  SMALL",         
22d30 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20     -1,          
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
22d60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42  QLITE_LIMIT_TOOB
22d70 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IG",            
22d80 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54    SQLITE_LIMIT_T
22d90 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 20 20  RIGGER_DEPTH+1  
22da0 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
22db0 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20 76  t i, id;.  int v
22dc0 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  al;.  const char
22dd0 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62   *zId;..  if( ob
22de0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
22df0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22e00 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
22e10 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22e20 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
22e30 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22e40 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22e50 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29  DB ID VALUE", 0)
22e60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22e70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22e80 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22e90 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22ea0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22eb0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
22ec0 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20  _ERROR;.  zId = 
22ed0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22ee0 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[2]);.  for(i=
22ef0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29  0; i<sizeof(aId)
22f00 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b  /sizeof(aId[0]);
22f10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
22f20 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69  trcmp(zId, aId[i
22f30 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
22f40 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d       id = aId[i]
22f50 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .id;.      break
22f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
22f70 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29  ( i>=sizeof(aId)
22f80 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20  /sizeof(aId[0]) 
22f90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22fa0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22fb0 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74  "unknown limit t
22fc0 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68  ype: ", zId, (ch
22fd0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
22fe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22ff0 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
23000 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
23010 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
23020 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
23030 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
23040 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64  te3_limit(db, id
23050 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , val);.  Tcl_Se
23060 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23070 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23080 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
23090 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
230a0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65  ** tclcmd:  save
230b0 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a  _prng_state.**.*
230c0 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74 65  * Save the state
230d0 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72   of the pseudo-r
230e0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
230f0 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68  erator..** At th
23100 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72  e same time, ver
23110 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65 33  ify that sqlite3
23120 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f  _test_control wo
23130 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  rks even when.**
23140 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20   called with an 
23150 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63  out-of-range opc
23160 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
23170 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61  nt save_prng_sta
23180 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
23190 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
231a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
231b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
231c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
231d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
231e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
231f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
23200 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
23210 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
23220 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
23230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
23240 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
23250 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
23260 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
23270 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
23280 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
23290 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39  _test_control(99
232a0 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  99);.  assert( r
232b0 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  c==0 );.  rc = s
232c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
232d0 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72  rol(-1);.  asser
232e0 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71  t( rc==0 );.  sq
232f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
23300 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
23310 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20  RL_PRNG_SAVE);. 
23320 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23330 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
23340 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
23350 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
23360 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73  t restore_prng_s
23370 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  tate(.  ClientDa
23380 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
23390 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
233a0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
233b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
233c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
233d0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
233e0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
233f0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
23400 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
23410 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
23420 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
23430 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
23440 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
23450 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
23460 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
23470 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
23480 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
23490 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
234a0 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ORE);.  return T
234b0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
234c0 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70 72  clcmd:  reset_pr
234d0 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74  ng_state.*/.stat
234e0 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72 6e  ic int reset_prn
234f0 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
23500 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23510 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
23520 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
23530 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
23540 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23550 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
23560 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
23570 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
23580 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
23590 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
235a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
235b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
235c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
235d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
235e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
235f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
23600 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
23610 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
23620 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  ESET);.  return 
23630 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23640 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65   tclcmd:  pcache
23650 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63  _stats.*/.static
23660 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68 65   int test_pcache
23670 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74  _stats(.  Client
23680 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23690 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
236a0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
236b0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
236c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
236d0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
236e0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
236f0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23700 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23710 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23720 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23730 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23740 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23750 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23760 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23770 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20  {.  int nMin;.  
23780 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20  int nMax;.  int 
23790 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20  nCurrent;.  int 
237a0 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54  nRecyclable;.  T
237b0 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
237c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74   sqlite3PcacheSt
237d0 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26  ats(&nCurrent, &
237e0 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52  nMax, &nMin, &nR
237f0 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70  ecyclable);..  p
23800 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
23810 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
23820 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
23830 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
23840 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
23850 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20  urrent", -1));. 
23860 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
23870 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
23880 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
23890 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29  ntObj(nCurrent))
238a0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
238b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
238c0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
238d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78  ewStringObj("max
238e0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
238f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
23900 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
23910 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
23920 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMax));.  Tcl_Li
23930 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
23940 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
23950 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
23960 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20  j("min", -1));. 
23970 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
23980 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
23990 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
239a0 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20  ntObj(nMin));.  
239b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
239c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
239d0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
239e0 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61  ringObj("recycla
239f0 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  ble", -1));.  Tc
23a00 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
23a10 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
23a20 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
23a30 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29  bj(nRecyclable))
23a40 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
23a50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
23a60 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
23a70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  CL_OK;.}..#ifdef
23a80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
23a90 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61  NLOCK_NOTIFY.sta
23aa0 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e  tic void test_un
23ab0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76  lock_notify_cb(v
23ac0 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20  oid **aArg, int 
23ad0 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b  nArg){.  int ii;
23ae0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
23af0 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nArg; ii++){.   
23b00 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c   Tcl_EvalEx((Tcl
23b10 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69  _Interp *)aArg[i
23b20 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  i], "unlock_noti
23b30 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  fy", -1, TCL_EVA
23b40 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d  L_GLOBAL);.  }.}
23b50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23b60 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
23b70 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NOTIFY */../*.**
23b80 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
23b90 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20  3_unlock_notify 
23ba0 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  db.*/.#ifdef SQL
23bb0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
23bc0 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
23bd0 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  int test_unlock_
23be0 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74  notify(.  Client
23bf0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23c00 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
23c10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23c20 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23c30 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c40 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23c50 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23c60 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23c70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23c80 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23c90 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23ca0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23cb0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23cc0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
23cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
23ce0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
23cf0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
23d00 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
23d10 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
23d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23d30 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
23d40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
23d50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
23d60 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
23d70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23d80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
23d90 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f   sqlite3_unlock_
23da0 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f  notify(db, test_
23db0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
23dc0 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70  , (void *)interp
23dd0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
23de0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
23df0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
23e00 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
23e10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23e20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
23e30 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
23e40 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
23e50 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73  t db ?NAME?.*/.s
23e60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77  tatic int test_w
23e70 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20  al_checkpoint(. 
23e80 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
23e90 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
23ea0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
23eb0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
23ec0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
23ed0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
23ee0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
23ef0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
23f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23f10 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
23f20 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
23f30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
23f40 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
23f50 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
23f60 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  *zDb = 0;.  sqli
23f70 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
23f80 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
23f90 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  3 && objc!=2 ){.
23fa0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
23fb0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
23fc0 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f  objv, "DB ?NAME?
23fd0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
23fe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
23ff0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
24000 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
24010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
24020 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
24030 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24040 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
24050 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54  3 ){.    zDb = T
24060 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24070 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20  v[2]);.  }.  rc 
24080 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  = sqlite3_wal_ch
24090 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62  eckpoint(db, zDb
240a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
240b0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
240c0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
240d0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
240e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
240f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
24100 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  d:  test_sqlite3
24110 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f  _log ?SCRIPT?.*/
24120 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c  .static struct L
24130 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54  ogCallback {.  T
24140 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65  cl_Interp *pInte
24150 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
24160 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61  Obj;.} logcallba
24170 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61  ck = {0, 0};.sta
24180 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c  tic void xLogcal
24190 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73  lback(void *unus
241a0 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61  ed, int err, cha
241b0 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f  r *zMsg){.  Tcl_
241c0 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f  Obj *pNew = Tcl_
241d0 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67  DuplicateObj(log
241e0 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
241f0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
24200 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f  nt(pNew);.  Tcl_
24210 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
24220 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70  ment(.      0, p
24230 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  New, Tcl_NewStri
24240 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 54 65 73  ngObj(sqlite3Tes
24250 74 45 72 72 6f 72 4e 61 6d 65 28 65 72 72 29 2c  tErrorName(err),
24260 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f   -1).  );.  Tcl_
24270 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
24280 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63  ment(0, pNew, Tc
24290 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
242a0 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Msg, -1));.  Tcl
242b0 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61  _EvalObjEx(logca
242c0 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20  llback.pInterp, 
242d0 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  pNew, TCL_EVAL_G
242e0 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44  LOBAL|TCL_EVAL_D
242f0 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
24300 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
24310 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
24320 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28  est_sqlite3_log(
24330 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24340 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
24350 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24360 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24370 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24380 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24390 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
243a0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
243b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
243c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
243d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
243e0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
243f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24400 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20  if( objc>2 ){.  
24410 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24420 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24430 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
24440 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24450 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ROR;.  }.  if( l
24460 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
24470 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
24480 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
24490 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
244a0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
244b0 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  = 0;.    logcall
244c0 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30  back.pInterp = 0
244d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
244e0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
244f0 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20  IG_LOG, 0, 0);. 
24500 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20   }.  if( objc>1 
24510 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  ){.    logcallba
24520 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ck.pObj = objv[1
24530 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ];.    Tcl_IncrR
24540 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
24550 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
24560 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
24570 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
24580 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
24590 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
245a0 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c  G, xLogcallback,
245b0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
245c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
245d0 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72  **     tcl_objpr
245e0 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41  oc COMMANDNAME A
245f0 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e  RGS....**.** Run
24600 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75   a TCL command u
24610 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63  sing its objProc
24620 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72   interface.  Thr
24630 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a  ow an error if.*
24640 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61  * the command ha
24650 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74  s no objProc int
24660 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
24670 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72  c int runAsObjPr
24680 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  oc(.  void * cli
24690 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
246a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
246b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
246c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
246d0 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
246e0 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69  nfo cmdInfo;.  i
246f0 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
24700 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
24710 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
24720 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  v, "COMMAND ..."
24730 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24740 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24750 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
24760 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
24770 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24780 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
24790 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
247a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
247b0 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
247c0 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  und: ",.        
247d0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
247e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
247f0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
24800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24810 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62    if( cmdInfo.ob
24820 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  jProc==0 ){.    
24830 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24840 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
24850 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
24860 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
24870 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24880 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
24890 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
248a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
248b0 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62  eturn cmdInfo.ob
248c0 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62  jProc(cmdInfo.ob
248d0 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  jClientData, int
248e0 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a  erp, objc-1, obj
248f0 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  v+1);.}..#ifndef
24900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
24910 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49  LAIN./*.** WARNI
24920 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  NG: The followin
24930 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e  g function, prin
24940 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
24950 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a  n() is an exact.
24960 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70  ** copy of examp
24970 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70  le code from eqp
24980 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20  .in (eqp.html). 
24990 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  If this code is 
249a0 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65  modified,.** the
249b0 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  n the documentat
249c0 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74  ion copy needs t
249d0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
249e0 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   well..*/./*.** 
249f0 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69  Argument pStmt i
24a00 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c  s a prepared SQL
24a10 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
24a20 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c   function compil
24a30 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e  es.** an EXPLAIN
24a40 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
24a50 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e  and to report on
24a60 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
24a70 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20  atement,.** and 
24a80 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72  prints the repor
24a90 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e  t to stdout usin
24aa0 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69  g printf()..*/.i
24ab0 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  nt printExplainQ
24ac0 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33  ueryPlan(sqlite3
24ad0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
24ae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
24af0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
24b00 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f   /* Input SQL */
24b10 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  .  char *zExplai
24b20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
24b30 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45     /* SQL with E
24b40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
24b50 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20  N prepended */. 
24b60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24b70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  Explain;        
24b80 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50   /* Compiled EXP
24b90 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
24ba0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24bb0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24bd0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
24be0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24bf0 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c  _v2() */..  zSql
24c00 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
24c10 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71  Stmt);.  if( zSq
24c20 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
24c30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a  LITE_ERROR;..  z
24c40 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
24c50 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
24c60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
24c70 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ", zSql);.  if( 
24c80 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  zExplain==0 ) re
24c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24ca0 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  M;..  rc = sqlit
24cb0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71  e3_prepare_v2(sq
24cc0 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
24cd0 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e  pStmt), zExplain
24ce0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
24cf0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
24d00 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  ree(zExplain);. 
24d10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24d20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24d30 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
24d40 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
24d50 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
24d60 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69      int iSelecti
24d70 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
24d80 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
24d90 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72   0);.    int iOr
24da0 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  der = sqlite3_co
24db0 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
24dc0 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 1);.    int i
24dd0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  From = sqlite3_c
24de0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
24df0 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73  in, 2);.    cons
24e00 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20  t char *zDetail 
24e10 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
24e20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24e30 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
24e40 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ;..    printf("%
24e50 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69  d %d %d %s\n", i
24e60 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72  Selectid, iOrder
24e70 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c  , iFrom, zDetail
24e80 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
24e90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
24ea0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a  e(pExplain);.}..
24eb0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
24ec0 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69  print_eqp(.  voi
24ed0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
24ee0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
24ef0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
24f00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
24f10 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
24f20 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
24f30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
24f40 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
24f50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
24f60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
24f70 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
24f80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24f90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
24fa0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
24fb0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24fc0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
24fd0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
24fe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
24ff0 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
25000 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20  ryPlan(pStmt);. 
25010 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
25020 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
25030 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
25040 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
25050 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
25060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
25070 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20  LAIN */../*.**  
25080 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e      optimization
25090 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20  _control DB OPT 
250a0 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e  BOOLEAN.**.** En
250b0 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
250c0 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69  query optimizati
250d0 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73 71  ons using the sq
250e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
250f0 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ol().** interfac
25100 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20 42  e.  Disable if B
25110 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20  OOLEAN is false 
25120 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f  and enable if BO
25130 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a  OLEAN is true..*
25140 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d  * OPT is the nam
25150 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  e of the optimiz
25160 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61  ation to be disa
25170 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bled..*/.static 
25180 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  int optimization
25190 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64  _control(.  void
251a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
251b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
251c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
251d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
251e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
251f0 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
25200 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
25210 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e   *zOpt;.  int on
25220 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b  off;.  int mask;
25230 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25240 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
25250 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
25260 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b  e;.    int mask;
25270 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a  .  } aOpt[] = {.
25280 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20      { "all",    
25290 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
252a0 5f 4f 70 74 4d 61 73 6b 20 20 20 20 20 20 20 20  _OptMask        
252b0 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d  },.    { "query-
252c0 66 6c 61 74 74 65 6e 65 72 22 2c 20 20 53 51 4c  flattener",  SQL
252d0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
252e0 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c  er },.    { "col
252f0 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20  umn-cache",     
25300 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
25310 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  he    },.    { "
25320 69 6e 64 65 78 2d 73 6f 72 74 22 2c 20 20 20 20  index-sort",    
25330 20 20 20 53 51 4c 49 54 45 5f 49 6e 64 65 78 53     SQLITE_IndexS
25340 6f 72 74 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ort      },.    
25350 7b 20 22 69 6e 64 65 78 2d 73 65 61 72 63 68 22  { "index-search"
25360 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 49 6e 64  ,     SQLITE_Ind
25370 65 78 53 65 61 72 63 68 20 20 20 20 7d 2c 0a 20  exSearch    },. 
25380 20 20 20 7b 20 22 69 6e 64 65 78 2d 63 6f 76 65     { "index-cove
25390 72 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  r",      SQLITE_
253a0 49 6e 64 65 78 43 6f 76 65 72 20 20 20 20 20 7d  IndexCover     }
253b0 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62 79  ,.    { "groupby
253c0 2d 6f 72 64 65 72 22 2c 20 20 20 20 53 51 4c 49  -order",    SQLI
253d0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
253e0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74    },.    { "fact
253f0 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 53  or-constants", S
25400 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
25410 6f 6e 73 74 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20  onst },.  };..  
25420 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
25430 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
25440 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
25450 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f  bjv, "DB OPT BOO
25460 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
25470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25480 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
25490 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
254a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
254b0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
254c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
254d0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
254e0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
254f0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66  , objv[3], &onof
25500 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  f) ) return TCL_
25510 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20  ERROR;.  zOpt = 
25520 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
25530 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[2]);.  for(i=
25540 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
25550 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
25560 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
25570 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f   strcmp(zOpt, aO
25580 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d  pt[i].zOptName)=
25590 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  =0 ){.      mask
255a0 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b   = aOpt[i].mask;
255b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
255c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e    }.  }.  if( on
255d0 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61  off ) mask = ~ma
255e0 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a  sk;.  if( i>=siz
255f0 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66  eof(aOpt)/sizeof
25600 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20  (aOpt[0]) ){.   
25610 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25620 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
25630 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  wn optimization 
25640 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  - should be one 
25650 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20  of:",.          
25660 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
25670 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *)0);.    for(i=
25680 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
25690 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
256a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  ); i++){.      T
256b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
256c0 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70  interp, " ", aOp
256d0 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3b 0a  t[i].zOptName);.
256e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
256f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25700 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
25710 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
25720 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
25730 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b  IONS, db, mask);
25740 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
25760 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
25770 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
25780 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
25790 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
257a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
257b0 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
257c0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
257d0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
257e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e  int sqlite3_foun
257f0 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  d_count;.  exter
25800 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  n int sqlite3_in
25810 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20  terrupt_count;. 
25820 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
25830 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
25840 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
25850 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  t sqlite3_sort_c
25860 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
25870 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
25880 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c  nt_time;.#if SQL
25890 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
258a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
258b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
258c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
258d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
258e0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
258f0 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72  ;.#endif.  exter
25900 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61  n int sqlite3_ma
25910 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78  x_blobsize;.  ex
25920 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
25930 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65  BtreeSharedCache
25940 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20  Report(void*,.  
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65          Tcl_Inte
25980 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a  rp*,int,Tcl_Obj*
25990 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69  CONST*);.  stati
259a0 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
259b0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
259c0 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78    Tcl_CmdProc *x
259d0 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  Proc;.  } aCmd[]
259e0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f   = {.     { "db_
259f0 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  enter",         
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
25a10 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e  l_CmdProc*)db_en
25a20 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
25a30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f    },.     { "db_
25a40 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20  leave",         
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
25a60 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65  l_CmdProc*)db_le
25a70 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ave             
25a80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25a90 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
25aa0 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
25ab0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25ac0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20  e3_mprintf_int  
25ad0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25ae0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
25af0 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  64",         (Tc
25b00 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25b10 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
25b20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25b30 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
25b40 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  g",          (Tc
25b50 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25b60 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20  e3_mprintf_long 
25b70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25b80 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
25b90 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
25ba0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25bb0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20  e3_mprintf_str  
25bc0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25bd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
25be0 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  r",          (Tc
25bf0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25c00 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
25c10 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
25c20 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
25c30 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63  only",       (Tc
25c40 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25c50 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
25c60 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  ly},.     { "sql
25c70 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
25c80 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63  ble",        (Tc
25c90 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25ca0 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
25cb0 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
25cc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
25cd0 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63  led",        (Tc
25ce0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
25cf0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
25d00 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  d },.     { "sql
25d10 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
25d20 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f  double",   (Tcl_
25d30 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
25d40 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
25d50 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  le},.     { "sql
25d60 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74  ite3_mprintf_z_t
25d70 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
25d80 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
25d90 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20  mprintf_z       
25da0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
25db0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65  te3_mprintf_n_te
25dc0 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
25dd0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
25de0 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20  printf_n        
25df0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
25e00 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22  e3_snprintf_int"
25e10 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
25e20 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e  CmdProc*)test_sn
25e30 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d  printf_int     }
25e40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
25e50 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
25e60 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43  wid",     (Tcl_C
25e70 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73  mdProc*)test_las
25e80 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c  t_rowid       },
25e90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
25ea0 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20  _exec_printf",  
25eb0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
25ec0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
25ed0 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a  _printf      },.
25ee0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
25ef0 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20  exec_hex",      
25f00 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
25f10 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
25f20 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  hex         },. 
25f30 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
25f40 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  xec",           
25f50 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
25f60 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20  roc*)test_exec  
25f70 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
25f80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
25f90 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20  ec_nr",         
25fa0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
25fb0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72  oc*)test_exec_nr
25fc0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
25fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25fe0 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20  _GET_TABLE.     
25ff0 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  { "sqlite3_get_t
26000 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20  able_printf",   
26010 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
26020 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f  )test_get_table_
26030 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66  printf },.#endif
26040 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
26050 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  _close",        
26060 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
26070 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
26080 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a  st_close     },.
26090 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
260a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
260b0 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
260c0 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
260d0 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
260e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
260f0 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
26100 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
26110 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
26120 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
26130 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
26140 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
26150 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
26160 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
26170 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
26180 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
26190 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
261a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
261b0 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
261c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
261d0 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
261e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
261f0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
26200 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
26210 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
26220 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
26250 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
26260 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
26270 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
262a0 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
262b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
262c0 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
262f0 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
26300 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
26310 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
26320 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
26330 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
26340 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
26350 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
26360 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
26370 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
26380 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
26390 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
263a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
263b0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
263c0 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54  tion",        (T
263d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
263e0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20  te_function     
263f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
26400 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
26410 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63  tion",       (Tc
26420 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
26430 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20  e_collation     
26440 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
26450 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
26460 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  it",        (Tcl
26470 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75  _CmdProc*)get_au
26480 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  tocommit        
26490 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
264a0 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20  e3_stack_used", 
264b0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
264c0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74  CmdProc*)test_st
264d0 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d  ack_used       }
264e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
264f0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c  3_busy_timeout",
26500 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
26510 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73  mdProc*)test_bus
26520 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c  y_timeout     },
26530 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22  .     { "printf"
26540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26550 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
26560 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e  dProc*)test_prin
26570 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf           },.
26580 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49       { "sqlite3I
26590 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  oTrace",        
265a0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
265b0 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
265c0 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  e         },.  }
265d0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
265e0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
265f0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
26600 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
26610 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
26620 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
26630 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
26640 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
26650 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
26660 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
26670 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
26680 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
26690 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
266a0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
266b0 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
266c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
266d0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
266e0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
266f0 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
26700 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
26710 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
26720 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
26730 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
26740 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
26750 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
26760 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
26770 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
26780 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
26790 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
267a0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
267b0 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
267c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
267d0 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
267e0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
267f0 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
26800 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
26810 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
26820 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
26830 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
26840 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
26850 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
26860 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
26870 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
26880 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
26890 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
268a0 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
268b0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
268c0 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
268d0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
268e0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
268f0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
26900 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
26910 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
26920 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
26930 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
26940 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
26950 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
26960 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
26970 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
26980 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
26990 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
269a0 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
269b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
269c0 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
269d0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
269e0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
269f0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
26a00 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
26a10 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
26a20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
26a30 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20  nded_errcode",  
26a40 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63      test_ex_errc
26a50 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ode    ,0 },.   
26a60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
26a70 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
26a80 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
26a90 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
26aa0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
26ab0 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
26ac0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
26ad0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
26ae0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
26af0 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
26b00 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
26b10 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
26b20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
26b30 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
26b40 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
26b50 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
26b60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
26b70 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20  _complete16",   
26b80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
26b90 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d  mplete16    ,0 }
26ba0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
26bb0 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
26bc0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
26bd0 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
26be0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
26bf0 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
26c00 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
26c10 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
26c20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
26c30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
26c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
26c50 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
26c60 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
26c70 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
26c80 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65  t3134",       te
26c90 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
26ca0 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  34, 0},.     { "
26cb0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
26cc0 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  6_v2",          
26cd0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
26ce0 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  2  ,0 },.     { 
26cf0 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  "sqlite3_finaliz
26d00 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
26d10 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20   test_finalize  
26d20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
26d30 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73   "sqlite3_stmt_s
26d40 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
26d50 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74    test_stmt_stat
26d60 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  us   ,0 },.     
26d70 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  { "sqlite3_reset
26d80 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
26d90 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20     test_reset   
26da0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
26db0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69   { "sqlite3_expi
26dc0 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  red",           
26dd0 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64      test_expired
26de0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
26df0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61    { "sqlite3_tra
26e00 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c  nsfer_bindings",
26e10 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66       test_transf
26e20 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20  er_bind ,0 },.  
26e30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68     { "sqlite3_ch
26e40 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
26e50 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67        test_chang
26e60 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  es       ,0 },. 
26e70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
26e80 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  tep",           
26e90 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70         test_step
26ea0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
26eb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
26ec0 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  sql",           
26ed0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
26ee0 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c             ,0 },
26ef0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
26f00 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20  _next_stmt",    
26f10 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65           test_ne
26f20 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d  xt_stmt     ,0 }
26f30 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
26f40 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22  3_stmt_readonly"
26f50 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
26f60 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20  tmt_readonly ,0 
26f70 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
26f80 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
26f90 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
26fa0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
26fb0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
26fc0 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
26fd0 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
26fe0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
26ff0 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
27000 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
27010 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
27020 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
27030 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
27040 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
27050 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
27060 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
27070 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
27080 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
27090 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
270a0 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
270b0 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
270c0 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
270d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
270e0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
270f0 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
27100 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
27110 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
27120 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
27130 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
27140 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
27150 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
27160 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
27170 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
27180 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
271a0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
271b0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
271c0 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
271d0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
271e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
271f0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
27200 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
27210 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
27220 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
27230 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
27250 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
27260 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6f    0 },.     { "o
27270 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
27280 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20 6f  rol",          o
27290 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
272a0 72 6f 6c 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22  rol,0},.     { "
272b0 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20  tcl_objproc",   
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20  runAsObjProc,   
272e0 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f      0 },..     /
272f0 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
27300 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20  _*() API */.    
27310 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
27320 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  mn_count",      
27330 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
27340 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20  count  ,0 },.   
27350 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74    { "sqlite3_dat
27360 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  a_count",       
27370 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63       test_data_c
27380 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ount    ,0 },.  
27390 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
273a0 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20  lumn_type",     
273b0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
273c0 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20  n_type   ,0 },. 
273d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
273e0 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20  olumn_blob",    
273f0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
27400 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a  mn_blob   ,0 },.
27410 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
27420 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20  column_double", 
27430 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
27440 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c  umn_double ,0 },
27450 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
27460 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20  _column_int64", 
27470 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
27480 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d  lumn_int64  ,0 }
27490 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
274a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
274b0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
274c0 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
274d0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c  3_column_text },
274e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
274f0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
27500 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
27510 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
27520 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a  _column_name },.
27530 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
27540 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
27550 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
27560 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
27570 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20  column_int  },. 
27580 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
27590 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74  olumn_bytes",  t
275a0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
275b0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
275c0 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69  olumn_bytes},.#i
275d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
275e0 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
275f0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
27600 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74  n_decltype",test
27610 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
27620 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
27630 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64  _decltype},.#end
27640 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
27650 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
27660 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74  ETADATA.{ "sqlit
27670 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
27680 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  se_name",test_st
27690 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
276a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
276b0 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  tabase_name},.{ 
276c0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
276d0 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74  table_name",test
276e0 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
276f0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
27700 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  _table_name},.{ 
27710 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
27720 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73  origin_name",tes
27730 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
27740 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
27750 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a  n_origin_name},.
27760 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
27770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
27780 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  6.     { "sqlite
27790 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
277a0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ", test_stmt_int
277b0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
277c0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
277d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
277e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
277f0 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
27800 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
27810 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
27820 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
27830 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
27840 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
27850 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
27860 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
27870 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64  16},.     { "add
27880 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
27890 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64  collations", add
278a0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
278b0 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20  collations, 0   
278c0 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
278d0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
278e0 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
278f0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
27900 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f  pe16",test_stmt_
27910 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c  utf16,(void*)sql
27920 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
27930 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  type16},.#endif.
27940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27950 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
27960 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63  DATA.{"sqlite3_c
27970 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
27980 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73  ame16",.  test_s
27990 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74  tmt_utf16, sqlit
279a0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
279b0 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  se_name16},.{"sq
279c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
279d0 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74  le_name16", test
279e0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
279f0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
27a00 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d  mn_table_name16}
27a10 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.{"sqlite3_colu
27a20 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
27a30 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
27a40 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
27a50 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
27a60 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66  _name16},.#endif
27a70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
27a80 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
27a90 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65  ollation_v2", te
27aa0 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
27ab0 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20  ion_v2, 0 },.   
27ac0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f    { "sqlite3_glo
27ad0 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20  bal_recover",   
27ae0 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65    test_global_re
27af0 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20  cover, 0   },.  
27b00 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34     { "working_64
27b10 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  bit_int",       
27b20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74     working_64bit
27b30 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  _int,   0   },. 
27b40 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e      { "vfs_unlin
27b50 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  k_test",        
27b60 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74      vfs_unlink_t
27b70 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  est,     0   },.
27b80 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74       { "vfs_init
27b90 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  fail_test",     
27ba0 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69       vfs_initfai
27bb0 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
27bc0 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72  .     { "vfs_unr
27bd0 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
27be0 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69        vfs_unregi
27bf0 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
27c00 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65  ,.     { "vfs_re
27c10 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20  register_all",  
27c20 20 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67         vfs_rereg
27c30 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20  ister_all,  0   
27c40 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
27c50 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20  control_test",  
27c60 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
27c70 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  trol_test,   0  
27c80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
27c90 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
27ca0 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  no_test", file_c
27cb0 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
27cc0 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
27cd0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
27ce0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
27cf0 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
27d00 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
27d10 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
27d20 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63   "file_control_c
27d30 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20  hunksize_test", 
27d40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
27d50 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20  nksize_test,  0 
27d60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
27d70 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20  ite3_vfs_list", 
27d80 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69            vfs_li
27d90 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
27da0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
27db0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
27dc0 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f  2", test_create_
27dd0 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d  function_v2, 0 }
27de0 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
27df0 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
27e00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27e10 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
27e20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
27e30 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
27e40 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
27e50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
27e60 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
27e70 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
27e80 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
27e90 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
27ea0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
27eb0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
27ec0 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
27ed0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
27ee0 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
27ef0 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c  e3_test_errstr",
27f00 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
27f10 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
27f20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76  },.     { "tcl_v
27f30 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20  ariable_type",  
27f40 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c       tcl_variabl
27f50 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20 20  e_type, 0       
27f60 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
27f70 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
27f80 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  CHE.     { "sqli
27f90 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
27fa0 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65  d_cache", test_e
27fb0 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20  nable_shared, 0 
27fc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
27fd0 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
27fe0 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65  _report", sqlite
27ff0 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
28000 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e  eReport, 0},.#en
28010 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
28020 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
28030 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62  umber", test_lib
28040 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20  version_number, 
28050 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  0  },.#ifdef SQL
28060 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
28070 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
28080 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
28090 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
280a0 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
280b0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
280c0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    },.#endif.#ifn
280d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
280e0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20  INCRBLOB.     { 
280f0 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65  "sqlite3_blob_re
28100 61 64 22 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62  ad",   test_blob
28110 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20  _read, 0  },.   
28120 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
28130 62 5f 77 72 69 74 65 22 2c 20 20 74 65 73 74 5f  b_write",  test_
28140 62 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d  blob_write, 0  }
28150 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
28160 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20  3_blob_reopen", 
28170 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
28180 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
28190 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
281a0 65 73 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f  es",  test_blob_
281b0 62 79 74 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20  bytes, 0  },.   
281c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
281d0 62 5f 63 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f  b_close",  test_
281e0 62 6c 6f 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d  blob_close, 0  }
281f0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
28200 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20  "pcache_stats", 
28210 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68        test_pcach
28220 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23  e_stats, 0  },.#
28230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28240 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
28250 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  Y.     { "sqlite
28260 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22  3_unlock_notify"
28270 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  , test_unlock_no
28280 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  tify, 0  },.#end
28290 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
282a0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
282b0 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63  t",   test_wal_c
282c0 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c  heckpoint, 0  },
282d0 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71  .     { "test_sq
282e0 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20  lite3_log",     
282f0 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
28300 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 20 20 20 20  _log, 0  },.    
28310 20 7b 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69   { "print_explai
28320 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74  n_query_plan", t
28330 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30  est_print_eqp, 0
28340 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
28350 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73  ic int bitmask_s
28360 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74  ize = sizeof(Bit
28370 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69  mask)*8;.  int i
28380 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
28390 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
283a0 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
283b0 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
283c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
283d0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
283e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
283f0 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
28400 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
28410 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
28420 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
28430 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
28440 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
28450 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
28460 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
28470 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
28480 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
28490 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
284a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
284b0 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  IN.  extern int 
284c0 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
284d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
284e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
284f0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
28500 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
28510 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
28520 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
28530 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  n int sqlite3Vdb
28540 65 41 64 64 6f 70 54 72 61 63 65 3b 0a 20 20 65  eAddopTrace;.  e
28550 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
28560 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69  3WalTrace;.#endi
28570 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
28580 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 63 68  TEST.  extern ch
28590 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
285a0 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69  _plan[];.  stati
285b0 63 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c  c char *query_pl
285c0 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65  an = sqlite3_que
285d0 72 79 5f 70 6c 61 6e 3b 0a 23 69 66 64 65 66 20  ry_plan;.#ifdef 
285e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
285f0 53 33 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  S3.  extern int 
28600 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61  sqlite3_fts3_ena
28610 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b  ble_parentheses;
28620 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
28630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
28640 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66  eof(aCmd)/sizeof
28650 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  (aCmd[0]); i++){
28660 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43  .    Tcl_CreateC
28670 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
28680 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43  Cmd[i].zName, aC
28690 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20  md[i].xProc, 0, 
286a0 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  0);.  }.  for(i=
286b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a  0; i<sizeof(aObj
286c0 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a  Cmd)/sizeof(aObj
286d0 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
286e0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
286f0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
28700 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  aObjCmd[i].zName
28710 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43  , .        aObjC
28720 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62  md[i].xProc, aOb
28730 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61  jCmd[i].clientDa
28740 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63  ta, 0);.  }.  Tc
28750 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
28760 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68  , "sqlite_search
28770 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
28780 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
28790 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43  search_count, TC
287a0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
287b0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
287c0 70 2c 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64  p, "sqlite_found
287d0 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
287e0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
287f0 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c  found_count, TCL
28800 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
28810 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
28820 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63  , "sqlite_sort_c
28830 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
28840 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f  har*)&sqlite3_so
28850 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  rt_count, TCL_LI
28860 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
28870 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
28880 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
28890 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63  size", .      (c
288a0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61  har*)&sqlite3_ma
288b0 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f  x_blobsize, TCL_
288c0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
288d0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
288e0 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f   "sqlite_like_co
288f0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
28900 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b  ar*)&sqlite3_lik
28910 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
28920 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
28930 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
28940 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f  qlite_interrupt_
28950 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
28960 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69  char*)&sqlite3_i
28970 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20  nterrupt_count, 
28980 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
28990 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
289a0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65  erp, "sqlite_ope
289b0 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a  n_file_count", .
289c0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
289d0 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
289e0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
289f0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
28a00 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
28a10 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
28a20 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
28a30 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  )&sqlite3_curren
28a40 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b  t_time, TCL_LINK
28a50 5f 49 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54  _INT);.#if SQLIT
28a60 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66  E_OS_UNIX && def
28a70 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
28a80 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28a90 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
28aa0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
28ab0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73  erp, "sqlite_hos
28ac0 74 69 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20  tid_num", .     
28ad0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
28ae0 5f 68 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c  _hostid_num, TCL
28af0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
28b00 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
28b10 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
28b20 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22  3_xferopt_count"
28b30 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
28b40 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
28b50 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
28b60 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
28b70 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
28b80 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
28b90 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  b_count",.      
28ba0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
28bb0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
28bc0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
28bd0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
28be0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
28bf0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
28c00 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
28c10 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
28c20 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
28c30 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
28c40 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
28c50 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
28c60 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
28c70 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
28c80 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
28c90 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20  r_writej_count, 
28ca0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
28cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28cc0 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
28cd0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
28ce0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
28cf0 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20  _counter",.     
28d00 20 28 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e   (char*)&unalign
28d10 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
28d20 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  r, TCL_LINK_INT)
28d30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
28d40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
28d50 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
28d60 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
28d70 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c  _last_needed_col
28d80 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28  lation",.      (
28d90 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43  char*)&pzNeededC
28da0 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49  ollation, TCL_LI
28db0 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49  NK_STRING|TCL_LI
28dc0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23  NK_READ_ONLY);.#
28dd0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
28de0 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69  _OS_WIN.  Tcl_Li
28df0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
28e00 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a  qlite_os_type",.
28e10 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
28e20 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54  lite3_os_type, T
28e30 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
28e40 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
28e50 54 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69  TE_TEST.  Tcl_Li
28e60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
28e70 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e  qlite_query_plan
28e80 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
28e90 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c  &query_plan, TCL
28ea0 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
28eb0 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
28ec0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
28ed0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54  SQLITE_DEBUG.  T
28ee0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
28ef0 70 2c 20 22 73 71 6c 69 74 65 5f 61 64 64 6f 70  p, "sqlite_addop
28f00 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
28f10 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 56 64  char*)&sqlite3Vd
28f20 62 65 41 64 64 6f 70 54 72 61 63 65 2c 20 54 43  beAddopTrace, TC
28f30 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
28f40 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
28f50 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65  p, "sqlite_where
28f60 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
28f70 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68  char*)&sqlite3Wh
28f80 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  ereTrace, TCL_LI
28f90 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
28fa0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
28fb0 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
28fc0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
28fd0 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20  sqlite3OSTrace, 
28fe0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
28ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29000 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e  IT_WAL.  Tcl_Lin
29010 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
29020 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c  lite_wal_trace",
29030 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
29040 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20  qlite3WalTrace, 
29050 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
29060 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
29070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29080 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
29090 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
290a0 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
290b0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
290c0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
290d0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
290e0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
290f0 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
29100 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
29110 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
29120 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
29130 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
29140 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
29150 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
29160 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
29170 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
29180 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
29190 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
291a0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
291b0 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
291c0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
291d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
291e0 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
291f0 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
29200 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
29210 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
29220 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
29230 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
29240 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69  erp, "bitmask_si
29250 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ze",.      (char
29260 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c  *)&bitmask_size,
29270 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
29280 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
29290 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
292a0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
292b0 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  _sync_count",.  
292c0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
292d0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
292e0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
292f0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
29300 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c  erp, "sqlite_ful
29310 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  lsync_count",.  
29320 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
29330 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
29340 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
29350 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
29360 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
29370 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  3) && defined(SQ
29380 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63 6c  LITE_TEST).  Tcl
29390 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
293a0 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e   "sqlite_fts3_en
293b0 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
293c0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
293d0 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  &sqlite3_fts3_en
293e0 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
293f0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
29400 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29410 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.