/ Hex Artifact Content
Login

Artifact e3e0ad1f0763a1aa6adf7e1c50727718eaa4bd32:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tcl.h".#include 
0250: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0260: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0270: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0280: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0290: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
02a0: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
02b0: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
02c0: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
02d0: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
02e0: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
02f0: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0300: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
0310: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
0320: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
0330: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
0340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
0350: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0370: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0380: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0390: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
03a0: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
03b0: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
03c0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
03d0: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
03e0: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
03f0: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0400: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
0410: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
0420: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
0430: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
0440: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
0450: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
0460: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0470: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0480: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0490: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
04a0: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
04b0: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
04c0: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
04d0: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
04e0: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
04f0: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0500: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
0510: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
0520: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
0530: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
0540: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
0550: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
0560: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0570: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0580: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0590: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
05a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
05b0: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
05c0: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
05d0: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
05e0: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
05f0: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0600: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
0610: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
0620: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
0630: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
0640: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
0650: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
0660: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0670: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0680: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0690: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
06a0: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
06b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
06c0: 74 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  t get_sqlite_poi
06d0: 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  nter(.  void * c
06e0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
06f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0700: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0710: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0720: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
0730: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
0740: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
0750: 6e 66 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  nfo;.  char zBuf
0760: 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a  [100];.  if( obj
0770: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
0780: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0790: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
07a0: 51 4c 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e  QLITE-CONNECTION
07b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
07c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
07d0: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
07e0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
07f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
0800: 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
0810: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
0820: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0830: 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
0840: 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  ound: ",.       
0850: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
0860: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
0870: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
0880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0890: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 53  .  p = (struct S
08a0: 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
08b0: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a  .objClientData;.
08c0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
08d0: 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  "%p", p->db);.  
08e0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75 66  if( strncmp(zBuf
08f0: 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20 20  ,"0x",2) ){.    
0900: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 30  sprintf(zBuf, "0
0910: 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  x%p", p->db);.  
0920: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
0930: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
0940: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
0950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
0960: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0970: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 20  r to an sqlite3 
0980: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 67  object..*/.int g
0990: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
09a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
09b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
09c0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 7b  sqlite3 **ppDb){
09d0: 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65  .  struct Sqlite
09e0: 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d 64  Db *p;.  Tcl_Cmd
09f0: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
0a00: 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if( Tcl_GetComma
0a10: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
0a20: 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  A, &cmdInfo) ){.
0a30: 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74 20      p = (struct 
0a40: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
0a50: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
0a60: 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d 3e  .    *ppDb = p->
0a70: 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  db;.  }else{.   
0a80: 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74 65   *ppDb = (sqlite
0a90: 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  3*)sqlite3TestTe
0aa0: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 7d  xtToPtr(zA);.  }
0ab0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0ac0: 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 63 68 61 72  ;.}...const char
0ad0: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72 72   *sqlite3TestErr
0ae0: 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  orName(int rc){.
0af0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
0b00: 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  ame = 0;.  switc
0b10: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
0b20: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0b40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
0b50: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
0b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0b70: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0b90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
0ba0: 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROR";           
0bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0bc0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
0bd0: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  L:            zN
0be0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
0bf0: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
0c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c10: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0c30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
0c40: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
0c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c60: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0c80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
0c90: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
0ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0cb0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0cd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
0ce0: 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SY";            
0cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0d00: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0d20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
0d30: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
0d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0d50: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
0d60: 53 48 41 52 45 44 43 41 43 48 45 3a 20 20 7a 4e  SHAREDCACHE:  zN
0d70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
0d80: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d90: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ";break;.    cas
0da0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0dc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0dd0: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
0de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0df0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
0e00: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  Y:            zN
0e10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
0e20: 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20  ADONLY";        
0e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0e40: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
0e50: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  PT:           zN
0e60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
0e70: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
0e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0e90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0eb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
0ec0: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
0ed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0ee0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
0ef0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
0f00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
0f10: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
0f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0f30: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
0f40: 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  D:            zN
0f50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0f60: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
0f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0f80: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
0fa0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55  ame = "SQLITE_FU
0fb0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  LL";            
0fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0fd0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
0fe0: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  N:            zN
0ff0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
1000: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
1010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1020: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
1030: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  L:            zN
1040: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
1050: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
1060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1070: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1090: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
10a0: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
10b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10c0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
10e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
10f0: 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20  HEMA";          
1100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1110: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1130: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
1140: 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20  OBIG";          
1150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1160: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
1170: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  INT:          zN
1180: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
1190: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
11a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11b0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
11c0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  H:            zN
11d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
11e0: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
11f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1200: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1220: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
1230: 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20  SUSE";          
1240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1250: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1270: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
1280: 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20  LFS";           
1290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12a0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
12c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
12d0: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
12e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12f0: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1310: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
1320: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
1330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1340: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1360: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
1370: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
1380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1390: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
13b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
13c0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13e0: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1400: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
1410: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
1420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1430: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
1460: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
1470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1480: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
1490: 45 41 44 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  EAD:          zN
14a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
14b0: 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20  ERR_READ";      
14c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
14e0: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 20 7a 4e  HORT_READ:    zN
14f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1500: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
1510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1520: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  e SQLITE_IOERR_W
1530: 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 7a 4e  RITE:         zN
1540: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1550: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
1560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1570: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
1580: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 7a 4e  SYNC:         zN
1590: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
15a0: 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20  ERR_FSYNC";     
15b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
15c0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
15d0: 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 7a 4e  IR_FSYNC:     zN
15e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
15f0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
1600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1610: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
1620: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 20 7a 4e  RUNCATE:      zN
1630: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1640: 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20  ERR_TRUNCATE";  
1650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1660: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
1670: 53 54 41 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  STAT:         zN
1680: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1690: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
16a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
16b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
16c0: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a 4e  NLOCK:        zN
16d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
16e0: 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20  ERR_UNLOCK";    
16f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1700: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
1710: 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a 4e  DLOCK:        zN
1720: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1730: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
1740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1750: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
1760: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  ELETE:        zN
1770: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1780: 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20  ERR_DELETE";    
1790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
17a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  e SQLITE_IOERR_B
17b0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 7a 4e  LOCKED:       zN
17c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
17d0: 45 52 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20  ERR_BLOCKED";   
17e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
17f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
1800: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 7a 4e  OMEM:         zN
1810: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1820: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
1830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1840: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
1850: 43 43 45 53 53 3a 20 20 20 20 20 20 20 20 7a 4e  CCESS:        zN
1860: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
1870: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
1880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1890: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
18a0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
18b0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
18e0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
18f0: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
1900: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1910: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
1920: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1930: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1940: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
1950: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1980: 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b  SQLITE_Unknown";
1990: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
19b0: 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  Name;.}.#define 
19c0: 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c 69  t1ErrorName sqli
19d0: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
19e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
19f0: 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  an sqlite3_stmt*
1a00: 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33   into an sqlite3
1a10: 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73  *.  This depends
1a20: 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20   on the.** fact 
1a30: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1a40: 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  * is the first f
1a50: 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65  ield in the Vdbe
1a60: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23   structure..*/.#
1a70: 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28  define StmtToDb(
1a80: 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  X)   sqlite3_db_
1a90: 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a  handle(X)../*.**
1aa0: 20 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20   Check a return 
1ab0: 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75  value to make su
1ac0: 72 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74  re it agrees wit
1ad0: 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  h the results.**
1ae0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
1af0: 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcode..*/.int sq
1b00: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1b10: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1b20: 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  erp, sqlite3 *db
1b30: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28  , int rc){.  if(
1b40: 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73   sqlite3_threads
1b50: 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d  afe()==0 && rc!=
1b60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
1b70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc!=SQLITE_OK. 
1b80: 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72    && sqlite3_err
1b90: 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a  code(db)!=rc ){.
1ba0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
1bb0: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d  0];.    int r2 =
1bc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1bd0: 28 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  (db);.    sprint
1be0: 66 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63  f(zBuf, "error c
1bf0: 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73  ode %s (%d) does
1c00: 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74   not match sqlit
1c10: 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25  e3_errcode %s (%
1c20: 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72  d)",.       t1Er
1c30: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c  rorName(rc), rc,
1c40: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29   t1ErrorName(r2)
1c50: 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52  , r2);.    Tcl_R
1c60: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
1c70: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  p);.    Tcl_Appe
1c80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c90: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72   zBuf, 0);.    r
1ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
1cb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1cc0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
1cd0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1ce0: 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  _stmt object..*/
1cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
1d00: 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63  tmtPointer(.  Tc
1d10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d20: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1d30: 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74  *zArg,  .  sqlit
1d40: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
1d50: 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
1d60: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73  (sqlite3_stmt*)s
1d70: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
1d80: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
1d90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1da0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1db0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
1dc0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1dd0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1de0: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1df0: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1e00: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1e10: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1e20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1e30: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1e40: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1e50: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1e60: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
1e70: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
1e80: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
1e90: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
1ea0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
1eb0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
1ec0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1ed0: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1ee0: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1ef0: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1f00: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1f10: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1f20: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1f30: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1f40: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1f50: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1f60: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
1f70: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
1f80: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
1f90: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
1fa0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
1fb0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
1fc0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1fd0: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1fe0: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1ff0: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
2000: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
2010: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
2020: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
2030: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
2040: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
2050: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
2060: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
2070: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
2080: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
2090: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
20a0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
20b0: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
20c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20d0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
20e0: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
20f0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
2100: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
2110: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
2120: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
2130: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
2140: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
2150: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
2160: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
2170: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
2180: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
2190: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
21a0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
21b0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
21c0: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
21d0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
21e0: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
21f0: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
2200: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
2210: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
2230: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
2240: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
2250: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
2260: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
2270: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2280: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
2290: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  callback..*/.#if
22a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22b0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
22c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
22d0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73  NABLE_IOTRACE).s
22e0: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
22f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
2300: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
2310: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
2320: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2330: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2340: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
2350: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
2360: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
2370: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
2380: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2390: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
23a0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e  ace_file);.}.#en
23b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
23c0: 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45  :  io_trace FILE
23d0: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  NAME.**.** Turn 
23e0: 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  I/O tracing on o
23f0: 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e  r off.  If FILEN
2400: 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  AME is not an em
2410: 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49  pty string,.** I
2420: 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e  /O tracing begin
2430: 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c  s going into FIL
2440: 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41  ENAME. If FILENA
2450: 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a  ME is an empty.*
2460: 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72  * string, I/O tr
2470: 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  acing is turned 
2480: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2490: 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  nt test_io_trace
24a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
24b0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
24c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24e0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24f0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2500: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2520: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2530: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2550: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2560: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ment */.){.#if !
2570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2580: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
2590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
25a0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69  BLE_IOTRACE).  i
25b0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
25c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25e0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25f0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2600: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49  ,.          " FI
2610: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
2620: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2630: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ROR;.  }.  if( i
2640: 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20  otrace_file ){. 
2650: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66     if( iotrace_f
2660: 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69  ile!=stdout && i
2670: 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64  otrace_file!=std
2680: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  err ){.      fcl
2690: 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ose(iotrace_file
26a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74  );.    }.    iot
26b0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20  race_file = 0;. 
26c0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
26d0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
26e0: 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20   argv[1][0] ){. 
26f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
2700: 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d  gv[1],"stdout")=
2710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72  =0 ){.      iotr
2720: 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75  ace_file = stdou
2730: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
2740: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
2750: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
2760: 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69        iotrace_fi
2770: 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20  le = stderr;.   
2780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
2790: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70  trace_file = fop
27a0: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29  en(argv[1], "w")
27b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
27c0: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f  te3IoTrace = io_
27d0: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a  trace_callback;.
27e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
2800: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2810: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
2820: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
2830: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  TRING.**.** Invo
2840: 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ke the sqlite3_e
2850: 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e 74  xec_printf() int
2860: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
2870: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
2880: 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69  * DB.  The SQL i
2890: 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52  s the string FOR
28a0: 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74  MAT.  The format
28b0: 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63   string should c
28c0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73  ontain.** one %s
28d0: 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20   or %q.  STRING 
28e0: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73  is the value ins
28f0: 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72  erted into %s or
2900: 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   %q..*/.static i
2910: 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72 69  nt test_exec_pri
2920: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
2930: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2940: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2950: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2960: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2970: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2980: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
29c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
29d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
29e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
29f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2a00: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2a10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2a20: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
2a30: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
2a40: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2a50: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
2a60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a90: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2aa0: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52  .       " DB FOR
2ab0: 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b  MAT STRING", 0);
2ac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ad0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2ae0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2af0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2b00: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2b10: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
2b20: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
2b30: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2b40: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
2b50: 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72  ], argv[3]);.  r
2b60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2b70: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f  (db, zSql, exec_
2b80: 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c  printf_cb, &str,
2b90: 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74   &zErr);.  sqlit
2ba0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2bb0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2bc0: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
2bd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2be0: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54  terp, zBuf);.  T
2bf0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2c00: 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c  (interp, rc==SQL
2c10: 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74  ITE_OK ? Tcl_DSt
2c20: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20  ringValue(&str) 
2c30: 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44  : zErr);.  Tcl_D
2c40: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
2c50: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
2c60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2c70: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2c80: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
2c90: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
2ca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2cb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2cd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68    sqlite3_exec_h
2ce0: 65 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a  ex  DB  HEX.**.*
2cf0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
2d00: 69 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61  ite3_exec() on a
2d10: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
2d20: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e  obtained by tran
2d30: 73 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69  slating.** HEX i
2d40: 6e 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74  nto ASCII.  Most
2d50: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
2d60: 74 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73  translated as is
2d70: 2e 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a  .  %HH becomes.*
2d80: 2a 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65  * a hex characte
2d90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2da0: 20 74 65 73 74 5f 65 78 65 63 5f 68 65 78 28 0a   test_exec_hex(.
2db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2ea0: 20 72 63 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61   rc, i, j;.  cha
2eb0: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
2ec0: 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61  har *zHex;.  cha
2ed0: 72 20 7a 53 71 6c 5b 35 30 30 5d 3b 0a 20 20 63  r zSql[500];.  c
2ee0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2ef0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2f40: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2f50: 48 45 58 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  HEX", 0);.    re
2f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f70: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2f80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2f90: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2fb0: 0a 20 20 7a 48 65 78 20 3d 20 61 72 67 76 5b 32  .  zHex = argv[2
2fc0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  ];.  for(i=j=0; 
2fd0: 69 3c 73 69 7a 65 6f 66 28 7a 53 71 6c 29 20 26  i<sizeof(zSql) &
2fe0: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2ff0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
3000: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
3010: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
3020: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
3030: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
3040: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
3050: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
3060: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
3070: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
3080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3090: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
30a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
30b0: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
30c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
30d0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
30e0: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
30f0: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
3100: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
3110: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3120: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3130: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3140: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3150: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3160: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
3170: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
3180: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3190: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
31a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
31b0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
31c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
31d0: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
31e0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
31f0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3210: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3230: 3a 20 20 64 62 5f 65 6e 74 65 72 20 44 42 0a 2a  :  db_enter DB.*
3240: 2a 20 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  *         db_lea
3250: 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20 45 6e 74 65  ve DB.**.** Ente
3260: 72 20 6f 72 20 6c 65 61 76 65 20 74 68 65 20 6d  r or leave the m
3270: 75 74 65 78 20 6f 6e 20 61 20 64 61 74 61 62 61  utex on a databa
3280: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
3290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
32a0: 65 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e  enter(.  void *N
32b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
32c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
32d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
32e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
32f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3300: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3330: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3340: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3350: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3360: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3380: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
3390: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
33a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
33b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
33c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
33d0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
33e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
33f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3400: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3410: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3420: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3430: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3450: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
3460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3470: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  .}.static int db
3480: 5f 6c 65 61 76 65 28 0a 20 20 76 6f 69 64 20 2a  _leave(.  void *
3490: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
34a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
34b0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
34c0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
34d0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
34e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
34f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
3510: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
3520: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
3530: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
3540: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3550: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
3560: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3570: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3580: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3590: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
35a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
35b0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
35c0: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
35d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
35e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
35f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
3600: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
3610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3630: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
3640: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3660: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  :  sqlite3_exec 
3670: 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49   DB  SQL.**.** I
3680: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
3690: 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65  3_exec interface
36a0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
36b0: 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f 0a 73  database DB.*/.s
36c0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
36d0: 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  xec(.  void *Not
36e0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
36f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
3700: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
3710: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
3720: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3730: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3750: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3760: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
3770: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
3780: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3790: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
37a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
37b0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
37c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
37d0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
37e0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
37f0: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75  i, j;.  char zBu
3800: 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67  f[30];.  if( arg
3810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
3820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3830: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
3840: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
3850: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
3860: 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
3870: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3880: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
3890: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
38a0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
38b0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
38c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
38d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
38e0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
38f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
3900: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f  , argv[2]);.  fo
3910: 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b 69 5d  r(i=j=0; zSql[i]
3920: 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  ;){.    if( zSql
3930: 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [i]=='%' ){.    
3940: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 28 74    zSql[j++] = (t
3950: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
3960: 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73  [i+1])<<4) + tes
3970: 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69  tHexToInt(zSql[i
3980: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  +2]);.      i +=
3990: 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
39a0: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
39b0: 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20 20 20   zSql[i++];.    
39c0: 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a 5d 20  }.  }.  zSql[j] 
39d0: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
39e0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
39f0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
3a00: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
3a10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3a20: 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66  zSql);.  sprintf
3a30: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29  (zBuf, "%d", rc)
3a40: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
3a50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
3a60: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
3a70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3a80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
3a90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
3aa0: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
3ab0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3ac0: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
3ad0: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
3ae0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
3af0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
3b00: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
3b10: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
3b20: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
3b30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3b40: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
3b50: 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53  3_exec_nr  DB  S
3b60: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
3b70: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
3b80: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3b90: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3ba0: 73 65 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a  se DB.  Discard.
3bb0: 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a  ** all results.*
3bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3bd0: 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69  t_exec_nr(.  voi
3be0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3bf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3c00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3c10: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3c20: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3c30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3c40: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3c60: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3c70: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3c80: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3c90: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3ca0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3cb0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
3cc0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
3cd0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
3ce0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3cf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3d00: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3d10: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3d20: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
3d30: 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
3d40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3d50: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
3d60: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
3d70: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
3d80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3d90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3da0: 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
3db0: 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  ], 0, 0, &zErr);
3dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
3dd0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
3de0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
3df0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3e00: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3e20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
3e30: 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54 4f  z_test  SEPARATO
3e40: 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e  R  ARG0  ARG1 ..
3e50: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ..**.** Test the
3e60: 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71   %z format of sq
3e70: 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20  lite_mprintf(). 
3e80: 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70   Use multiple mp
3e90: 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f  rintf() calls to
3ea0: 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65   .** concatenate
3eb0: 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61 72   arg0 through ar
3ec0: 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  gn using separat
3ed0: 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72 61  or as the separa
3ee0: 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  tor..** Return t
3ef0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
3f00: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70  atic int test_mp
3f10: 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20  rintf_z(.  void 
3f20: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3f30: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3f40: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3f50: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3f60: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3f70: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3f80: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3f90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3fa0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3fb0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3fc0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3fd0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3fe0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  {.  char *zResul
3ff0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
4000: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72  .  for(i=2; i<ar
4010: 67 63 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a  gc && (i==2 || z
4020: 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  Result); i++){. 
4030: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c     zResult = sql
4040: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
4050: 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20  %s%s", zResult, 
4060: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d  argv[1], argv[i]
4070: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
4080: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4090: 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  , zResult, 0);. 
40a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
40b0: 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
40c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
40d0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
40e0: 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
40f0: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54    STRING.**.** T
4100: 65 73 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61  est the %n forma
4110: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
4120: 6e 74 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74  ntf().  Return t
4130: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
4140: 0a 2a 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67  .** input string
4150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4160: 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a  test_mprintf_n(.
4170: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
4180: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4190: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
41a0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
41b0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
41c0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
41d0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4200: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
4210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4220: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4230: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
4240: 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d  *zStr;.  int n =
4250: 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c   0;.  zStr = sql
4260: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
4270: 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  %n", argv[1], &n
4280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
4290: 65 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53  e(zStr);.  Tcl_S
42a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
42b0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
42c0: 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(n));.  return 
42d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
42e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
42f0: 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53  _snprintf_int  S
4300: 49 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a  IZE FORMAT  INT.
4310: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f  **.** Test the o
4320: 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  f sqlite3_snprin
4330: 74 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  tf() routine.  S
4340: 49 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65 20  IZE is the size 
4350: 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
4360: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
4370: 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  .  The maximum s
4380: 69 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52  ize is 100.  FOR
4390: 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f  MAT is the.** fo
43a0: 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e  rmat string.  IN
43b0: 54 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  T is a single in
43c0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
43d0: 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73   The FORMAT.** s
43e0: 74 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69  tring must requi
43f0: 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  re no more than 
4400: 74 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72  this one integer
4410: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a   argument.  If.*
4420: 2a 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20  * You pass in a 
4430: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68  format string th
4440: 61 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65  at requires more
4450: 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65   than one argume
4460: 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67  nt,.** bad thing
4470: 73 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a  s will happen..*
4480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4490: 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a  t_snprintf_int(.
44a0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
44b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
44c0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
44d0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
44e0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
44f0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
4500: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
4510: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4520: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4530: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4550: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4560: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
4570: 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74  zStr[100];.  int
4580: 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31   n = atoi(argv[1
4590: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
45a0: 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76   *zFormat = argv
45b0: 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20  [2];.  int a1 = 
45c0: 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20  atoi(argv[3]);. 
45d0: 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53   if( n>sizeof(zS
45e0: 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66  tr) ) n = sizeof
45f0: 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zStr);.  sqlite
4600: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
4610: 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22  f(zStr), zStr, "
4620: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
4630: 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20  qrstuvwxyz");.  
4640: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4650: 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61  (n, zStr, zForma
4660: 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70  t, a1);.  Tcl_Ap
4670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4680: 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72  p, zStr, 0);.  r
4690: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
46a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
46b0: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a  OMIT_GET_TABLE..
46c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
46d0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
46e0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
46f0: 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e  AT  STRING  ?--n
4700: 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20  o-counts?.**.** 
4710: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
4720: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
4730: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
4740: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
4750: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
4760: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
4770: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
4780: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
4790: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
47a0: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
47b0: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
47c0: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
47d0: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
47e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
47f0: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
4800: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
4810: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4820: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4830: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4840: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4850: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4860: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4880: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4890: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
48a0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
48b0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
48c0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
48d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c  lite3 *db;.  Tcl
48e0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
48f0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
4900: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
4910: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
4920: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
4930: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
4940: 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[30];.  char *
4950: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43  zSql;.  int resC
4960: 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ount = -1;.  if(
4970: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
4980: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
4990: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
49a0: 26 72 65 73 43 6f 75 6e 74 29 20 29 20 72 65 74  &resCount) ) ret
49b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
49c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34   }.  if( argc!=4
49d0: 20 26 26 20 61 72 67 63 21 3d 35 20 29 7b 0a 20   && argc!=5 ){. 
49e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
49f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4a00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4a10: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4a20: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
4a30: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 20 3f 43  FORMAT STRING ?C
4a40: 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20  OUNT?", 0);.    
4a50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4a60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4a70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4a80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4aa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
4ab0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
4ac0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
4ad0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67  intf(argv[2],arg
4ae0: 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 61 72 67  v[3]);.  if( arg
4af0: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==5 ){.    rc =
4b00: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
4b10: 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52  le(db, zSql, &aR
4b20: 65 73 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45  esult, 0, 0, &zE
4b30: 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
4b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
4b50: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
4b60: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  l, &aResult, &nR
4b70: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72  ow, &nCol, &zErr
4b80: 29 3b 0a 20 20 20 20 72 65 73 43 6f 75 6e 74 20  );.    resCount 
4b90: 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b  = (nRow+1)*nCol;
4ba0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
4bb0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
4bc0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
4bd0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
4be0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4bf0: 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
4c00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4c10: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20      if( argc==4 
4c20: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
4c30: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f  (zBuf, "%d", nRo
4c40: 77 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  w);.      Tcl_Ap
4c50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4c60: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  rp, zBuf);.     
4c70: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
4c80: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
4c90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
4ca0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
4cb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4cc0: 28 69 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74  (i=0; i<resCount
4cd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
4ce0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4cf0: 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c 74 5b  interp, aResult[
4d00: 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20  i] ? aResult[i] 
4d10: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  : "NULL");.    }
4d20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
4d30: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4d40: 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20  interp, zErr);. 
4d50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
4d60: 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c 74 29  e_table(aResult)
4d70: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
4d80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
4d90: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
4da0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
4db0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
4dc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4dd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4de0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
4df0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
4e00: 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55  BLE */.../*.** U
4e10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c  sage:  sqlite3_l
4e20: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4e30: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
4e40: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f  s the integer RO
4e50: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
4e60: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a  recent insert..*
4e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4e80: 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20  t_last_rowid(.  
4e90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4ea0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4eb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4ec0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4ed0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4ee0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4ef0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4f20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4f40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4f50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4f60: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
4f70: 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[30];..  if( ar
4f80: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4f90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4fa0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4fb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4fc0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
4fd0: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
4fe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4ff0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5000: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5010: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
5020: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5030: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
5040: 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33   "%lld", sqlite3
5050: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5060: 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  id(db));.  Tcl_A
5070: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5080: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
5090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
50b0: 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44  :  sqlite3_key D
50c0: 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20  B KEY.**.** Set 
50d0: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
50e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
50f0: 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  t_key(.  void *N
5100: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
5110: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
5120: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
5130: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
5140: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
5150: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5170: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
5180: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
5190: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
51a0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
51b0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
51c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
51d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
51e0: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
51f0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
5200: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5210: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
5220: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
5230: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
5240: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
5250: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
5260: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5270: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
5280: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
5290: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
52a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
52b0: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
52c0: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
52d0: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
52e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
52f0: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
5300: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
5310: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
5320: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5330: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5340: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
5350: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
5360: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
5370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
5380: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
5390: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
53a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
53b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
53c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
53d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
53e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
53f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5410: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5420: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5430: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5440: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
5450: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
5460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5470: 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b  Key;.  int nKey;
5480: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
5490: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
54a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
54b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
54c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
54d0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
54e0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
54f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5500: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5510: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
5520: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
5530: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
5540: 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20  ERROR;.  zKey = 
5550: 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20  argv[2];.  nKey 
5560: 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a  = strlen(zKey);.
5570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
5580: 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65  S_CODEC.  sqlite
5590: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
55a0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
55b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
55c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
55d0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
55e0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
55f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
5600: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
5610: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
5620: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
5630: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
5640: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
5650: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
5660: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
5670: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
5680: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
5690: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56b0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
56c0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
56d0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
56e0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
56f0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
5700: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5710: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
5720: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
5730: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5740: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5750: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5760: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
5770: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
5780: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
57a0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
57b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
57c0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
57d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
57e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
57f0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
5800: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
5810: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
5820: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
5830: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
5840: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
5850: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5860: 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65  f the x_coalesce
5870: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  () function..** 
5880: 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  Return the first
5890: 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55   argument non-NU
58a0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
58b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69  static void t1_i
58c0: 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c  fnullFunc(.  sql
58d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
58e0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
58f0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5900: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5910: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5920: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55     if( SQLITE_NU
5940: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
5950: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20  e_type(argv[i]) 
5960: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
5970: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5980: 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20  ytes(argv[i]);. 
5990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
59a0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
59b0: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
59c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
59d0: 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [i]),.          
59e0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
59f0: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
5a00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
5a10: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
5a20: 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20  test functions. 
5a30: 20 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70     hex8() interp
5a40: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5a50: 74 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64  t as.** UTF8 and
5a60: 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65   returns a hex e
5a70: 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c  ncoding.  hex16l
5a80: 65 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  e() interprets i
5a90: 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61  ts argument.** a
5aa0: 73 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65  s UTF16le and re
5ab0: 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f  turns a hex enco
5ac0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
5ad0: 76 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71  void hex8Func(sq
5ae0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
5af0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
5b00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5b10: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
5b20: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ned char *z;.  i
5b30: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75  nt i;.  char zBu
5b40: 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71  f[200];.  z = sq
5b50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5b60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72  (argv[0]);.  for
5b70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  (i=0; i<sizeof(z
5b80: 42 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b  Buf)/2 - 2 && z[
5b90: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  i]; i++){.    sp
5ba0: 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d  rintf(&zBuf[i*2]
5bb0: 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30  , "%02x", z[i]&0
5bc0: 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  xff);.  }.  zBuf
5bd0: 5b 69 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  [i*2] = 0;.  sql
5be0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5bf0: 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c  (p, (char*)zBuf,
5c00: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
5c10: 53 49 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65  SIENT);.}.#ifnde
5c20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
5c30: 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
5c40: 68 65 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65  hex16Func(sqlite
5c50: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e  3_context *p, in
5c60: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5c70: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
5c80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5c90: 73 68 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20  short int *z;.  
5ca0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
5cb0: 75 66 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73  uf[400];.  z = s
5cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5cd0: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t16(argv[0]);.  
5ce0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
5cf0: 66 28 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26  f(zBuf)/4 - 4 &&
5d00: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
5d10: 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69   sprintf(&zBuf[i
5d20: 2a 34 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69  *4], "%04x", z[i
5d30: 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a  ]&0xff);.  }.  z
5d40: 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20  Buf[i*4] = 0;.  
5d50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5d60: 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42  ext(p, (char*)zB
5d70: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
5d80: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e  RANSIENT);.}.#en
5d90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  dif../*.** A str
5da0: 75 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63  ucture into whic
5db0: 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  h to accumulate 
5dc0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  text..*/.struct 
5dd0: 64 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c  dstr {.  int nAl
5de0: 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61  loc;  /* Space a
5df0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
5e00: 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70  t nUsed;   /* Sp
5e10: 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68  ace used */.  ch
5e20: 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68  ar *z;     /* Th
5e30: 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f  e space */.};../
5e40: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
5e50: 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74   to a dstr.*/.st
5e60: 61 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70  atic void dstrAp
5e70: 70 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72  pend(struct dstr
5e80: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5e90: 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29  *z, int divider)
5ea0: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  {.  int n = strl
5eb0: 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  en(z);.  if( p->
5ec0: 6e 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20  nUsed + n + 2 > 
5ed0: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
5ee0: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20   char *zNew;.   
5ef0: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e   p->nAlloc = p->
5f00: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32  nAlloc*2 + n + 2
5f10: 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73  00;.    zNew = s
5f20: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
5f30: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
5f40: 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30  .    if( zNew==0
5f50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5f60: 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  3_free(p->z);.  
5f70: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
5f80: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
5f90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5fa0: 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65  }.    p->z = zNe
5fb0: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76  w;.  }.  if( div
5fc0: 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64  ider && p->nUsed
5fd0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70  >0 ){.    p->z[p
5fe0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76  ->nUsed++] = div
5ff0: 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ider;.  }.  memc
6000: 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65  py(&p->z[p->nUse
6010: 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70  d], z, n+1);.  p
6020: 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a  ->nUsed += n;.}.
6030: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66  ./*.** Invoked f
6040: 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b  or each callback
6050: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65   from sqlite3Exe
6060: 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20  cFunc.*/.static 
6070: 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c  int execFuncCall
6080: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
6090: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
60a0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
60b0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75  NotUsed){.  stru
60c0: 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74  ct dstr *p = (st
60d0: 72 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61  ruct dstr*)pData
60e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
60f0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
6100: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76  +){.    if( argv
6110: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
6120: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e  dstrAppend(p, "N
6130: 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20  ULL", ' ');.    
6140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74  }else{.      dst
6150: 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b  rAppend(p, argv[
6160: 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a  i], ' ');.    }.
6170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6180: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
6190: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
61a0: 5f 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66  _sqlite_exec() f
61b0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
61c0: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a  unction takes.**
61d0: 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
61e0: 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20  nt and attempts 
61f0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
6200: 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20  argument as SQL 
6210: 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  code..** This is
6220: 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f   illegal and sho
6230: 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49  uld set the SQLI
6240: 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f  TE_MISUSE flag o
6250: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
6260: 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30  **.** 2004-Jan-0
6270: 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e  7:  We have chan
6280: 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65  ged this to make
6290: 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c   it legal to cal
62a0: 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  l sqlite3_exec()
62b0: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
62c0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
62d0: 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72    .** .** This r
62e0: 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73  outine simulates
62f0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68   the effect of h
6300: 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64  aving two thread
6310: 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  s attempt to.** 
6320: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6330: 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d  abase at the sam
6340: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e time..*/.stati
6350: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
6360: 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ecFunc(.  sqlite
6370: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6380: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
6390: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
63a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
63b0: 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20  truct dstr x;.  
63c0: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
63d0: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69  zeof(x));.  (voi
63e0: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28  d)sqlite3_exec((
63f0: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
6400: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
6410: 78 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72  xt),.      (char
6420: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6430: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20  text(argv[0]),. 
6440: 20 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c       execFuncCal
6450: 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20  lback, &x, 0);. 
6460: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6470: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e  text(context, x.
6480: 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49  z, x.nUsed, SQLI
6490: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
64a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e   sqlite3_free(x.
64b0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  z);.}../*.** Imp
64c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
64d0: 6b 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20  kt2213func(), a 
64e0: 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
64f0: 74 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74  that takes exact
6500: 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65  ly.** one argume
6510: 6e 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69  nt. It has two i
6520: 6e 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75  nteresting featu
6530: 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20  res:.**.** * It 
6540: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61  calls sqlite3_va
6550: 6c 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d  lue_text() 3 tim
6560: 65 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  es on the argume
6570: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
6580: 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74  *..**   If the t
6590: 68 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65  hree pointers re
65a0: 74 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74  turned are not t
65b0: 68 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65  he same an SQL e
65c0: 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a  rror is raised..
65d0: 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73  **.** * Otherwis
65e0: 65 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63  e it returns a c
65f0: 6f 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20  opy of the text 
6600: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6610: 66 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75  f its .**   argu
6620: 6d 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77  ment in such a w
6630: 61 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72  ay as the VDBE r
6640: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
6650: 20 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a   a Mem* cell .**
6660: 20 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f     with the MEM_
6670: 54 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e  Term flag clear.
6680: 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23   .**.** Ticket #
6690: 32 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f  2213 can therefo
66a0: 72 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20  re be tested by 
66b0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66  evaluating the f
66c0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20  ollowing.** SQL 
66d0: 65 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a  expression:.**.*
66e0: 2a 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28  *   tkt2213func(
66f0: 74 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73  tkt2213func('a s
6700: 74 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61  tring'));.*/.sta
6710: 74 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33  tic void tkt2213
6720: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
6730: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6740: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
6750: 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  c,  .  sqlite3_v
6760: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6770: 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e   int nText;.  un
6780: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
6790: 74 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73  t *zText1;.  uns
67a0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
67b0: 20 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69   *zText2;.  unsi
67c0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
67d0: 2a 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78  *zText3;..  nTex
67e0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
67f0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6800: 3b 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c  ;.  zText1 = sql
6810: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6820: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
6830: 74 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t2 = sqlite3_val
6840: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6850: 3b 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c  ;.  zText3 = sql
6860: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6870: 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28  argv[0]);..  if(
6880: 20 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20   zText1!=zText2 
6890: 7c 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74  || zText2!=zText
68a0: 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
68b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
68c0: 6e 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20  ntext, "tkt2213 
68d0: 69 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d  is not fixed", -
68e0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
68f0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28   char *zCopy = (
6900: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
6910: 61 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20  alloc(nText);.  
6920: 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
6930: 7a 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a  zText1, nText);.
6940: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6950: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6960: 20 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73   zCopy, nText, s
6970: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  }.}../*.** The f
6990: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e  ollowing SQL fun
69a0: 63 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72  ction takes 4 ar
69b0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e  guments.  The 2n
69c0: 64 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67  d and.** 4th arg
69d0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e  ument must be on
69e0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e  e of these strin
69f0: 67 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65  gs:  'text', 'te
6a00: 78 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c  xt16',.** or 'bl
6a10: 6f 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ob' correspondin
6a20: 67 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  g to API functio
6a30: 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  ns.**.**      sq
6a40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6a50: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
6a60: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6a70: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6a80: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a  3_value_blob().*
6a90: 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
6aa0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72  rgument is a str
6ab0: 69 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74  ing, either 'byt
6ac0: 65 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27  es' or 'bytes16'
6ad0: 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63   or 'noop',.** c
6ae0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6af0: 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  APIs:.**.**     
6b00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6b10: 79 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73  ytes().**      s
6b20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6b30: 65 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e  es16().**      n
6b40: 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50  oop.**.** The AP
6b50: 49 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79  Is designated by
6b60: 20 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68   the 2nd through
6b70: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61   4th arguments a
6b80: 72 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f  re applied.** to
6b90: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6ba0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49  ent in order.  I
6bb0: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72  f the pointers r
6bc0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
6bd0: 2a 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75  * second and fou
6be0: 72 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e  rth are differen
6bf0: 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
6c00: 72 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65  returns 1.  Othe
6c10: 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72  rwise,.** this r
6c20: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
6c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
6c40: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
6c50: 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
6c60: 6e 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  n returned point
6c70: 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ers from.** the 
6c80: 5f 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36  _text(), _text16
6c90: 28 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41  () and _blob() A
6ca0: 50 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  PIs become inval
6cb0: 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
6cc0: 63 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75  c void ptrChngFu
6cd0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
6ce0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6cf0: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
6d00: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
6d10: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
6d20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a  onst void *p1, *
6d30: 70 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p2;.  const char
6d40: 20 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72   *zCmd;.  if( ar
6d50: 67 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a  gc!=4 ) return;.
6d60: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
6d70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
6d80: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6d90: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
6da0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6db0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65   strcmp(zCmd,"te
6dc0: 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  xt")==0 ){.    p
6dd0: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
6de0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6df0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  ext(argv[0]);.#i
6e00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6e10: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
6e20: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6e30: 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b   "text16")==0 ){
6e40: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
6e50: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6e60: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
6e70: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
6e80: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6e90: 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30  zCmd, "blob")==0
6ea0: 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f   ){.    p1 = (co
6eb0: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
6ec0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
6ed0: 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[0]);.  }else{.
6ee0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6ef0: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
6f00: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
6f10: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
6f20: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
6f30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6f40: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79   strcmp(zCmd,"by
6f50: 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
6f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6f70: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  tes(argv[0]);.#i
6f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6f90: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
6fa0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6fb0: 20 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29   "bytes16")==0 )
6fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
6fd0: 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76  lue_bytes16(argv
6fe0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
6ff0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7000: 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30  zCmd, "noop")==0
7010: 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f   ){.    /* do no
7020: 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
7030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7040: 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73  }.  zCmd = (cons
7050: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
7060: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7070: 33 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  3]);.  if( zCmd=
7080: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7090: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22  f( strcmp(zCmd,"
70a0: 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  text")==0 ){.   
70b0: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
70c0: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
70d0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
70e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
70f0: 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73  MIT_UTF16.  }els
7100: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
7110: 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20  d, "text16")==0 
7120: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
7130: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
7140: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
7150: 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  gv[0]);.#endif. 
7160: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7170: 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d  p(zCmd, "blob")=
7180: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28  =0 ){.    p2 = (
7190: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
71a0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
71b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[0]);.  }else
71c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
71d0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
71e0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
71f0: 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p1!=p2);.}.../*.
7200: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
7210: 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  e_test_create_fu
7220: 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20  nction DB.**.** 
7230: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7240: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7250: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7260: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7270: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7280: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7290: 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20  d "x_coalesce". 
72a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
72b0: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69  oes the same thi
72c0: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f  ng.** as the "co
72d0: 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e  alesce" function
72e0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
72f0: 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20   also registers 
7300: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a  an SQL function.
7310: 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69  ** named "x_sqli
7320: 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e  te_exec" that in
7330: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78  vokes sqlite3_ex
7340: 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20  ec().  Invoking 
7350: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
7360: 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73  * in this way is
7370: 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69   illegal recursi
7380: 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61  on and should ra
7390: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
73a0: 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54  SUSE error..** T
73b0: 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d  he effect is sim
73c0: 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74  ilar to trying t
73d0: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
73e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
73f0: 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74  on from.** two t
7400: 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61  hreads at the sa
7410: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  me time..**.** T
7420: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
7430: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
7440: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
7450: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
7460: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
7470: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75  eate_function fu
7480: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
7490: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
74a0: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
74b0: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
74c0: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
74d0: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ion logic..*/.st
74e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
74f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
7500: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7510: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7520: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7530: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7540: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7550: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7560: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7570: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7580: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7590: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
75a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
75b0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
75c0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
75d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
75e0: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
75f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7600: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7610: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7620: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7630: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7640: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
7650: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7660: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
7670: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7680: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
7690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
76a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
76b0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
76c0: 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65  (db, "x_coalesce
76d0: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e  ", -1, SQLITE_AN
76e0: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74  Y, 0, .        t
76f0: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c  1_ifnullFunc, 0,
7700: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7720: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7730: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7740: 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49   "hex8", 1, SQLI
7750: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7760: 20 20 20 20 20 20 68 65 78 38 46 75 6e 63 2c 20        hex8Func, 
7770: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  0, 0);.  }.#ifnd
7780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7790: 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d 53  TF16.  if( rc==S
77a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
77c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
77d0: 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51 4c   "hex16", 1, SQL
77e0: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
77f0: 20 20 20 20 20 20 20 68 65 78 31 36 46 75 6e 63         hex16Func
7800: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
7810: 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
7820: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7830: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7840: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7850: 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31  "tkt2213func", 1
7860: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7870: 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32   .          tkt2
7880: 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  213Function, 0, 
7890: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
78a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
78b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
78c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
78d0: 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61  db, "pointer_cha
78e0: 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  nge", 4, SQLITE_
78f0: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
7900: 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69     ptrChngFuncti
7910: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  on, 0, 0);.  }..
7920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7930: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55  MIT_UTF16.  /* U
7940: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  se the sqlite3_c
7950: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7960: 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69  () API here. Mai
7970: 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74  nly for fun, but
7980: 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61   also .  ** beca
7990: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65  use it is not te
79a0: 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c  sted anywhere el
79b0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  se. */.  if( rc=
79c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
79d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55    const void *zU
79e0: 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65  tf16;.    sqlite
79f0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
7a00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
7a10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
7a20: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  );.    pVal = sq
7a30: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
7a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
7a50: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
7a60: 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78  -1, "x_sqlite_ex
7a70: 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ec", SQLITE_UTF8
7a80: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7a90: 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73  ;.    zUtf16 = s
7aa0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
7ab0: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
7ac0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69  16NATIVE);.    i
7ad0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7ae0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
7af0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7b20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
7b30: 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20  db, zUtf16, .   
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
7b50: 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62  SQLITE_UTF16, db
7b60: 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  , sqlite3ExecFun
7b70: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
7b90: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  Free(pVal);.    
7ba0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7bb0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7bc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
7bd0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
7be0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
7bf0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
7c00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
7c10: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
7c20: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
7c30: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
7c40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7c50: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
7c60: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
7c70: 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72  e x_count() aggr
7c80: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
7c90: 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20  **.** x_count() 
7ca0: 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65  counts the numbe
7cb0: 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72  r of non-null ar
7cc0: 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68  guments.  But th
7cd0: 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20  ere are.** some 
7ce0: 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74 69  twists for testi
7cf0: 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a  ng purposes..**.
7d00: 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  ** If the argume
7d10: 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20  nt to x_count() 
7d20: 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54 46  is 40 then a UTF
7d30: 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  -8 error is repo
7d40: 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  rted.** on the s
7d50: 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  tep function.  I
7d60: 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73  f x_count(41) is
7d70: 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54   seen, then a UT
7d80: 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73  F-16 error.** is
7d90: 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65   reported on the
7da0: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20   step function. 
7db0: 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f   If the total co
7dc0: 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a  unt is 42, then.
7dd0: 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72  ** a UTF-8 error
7de0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
7df0: 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e  the finalize fun
7e00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ction..*/.typede
7e10: 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74  f struct t1Count
7e20: 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a  Ctx t1CountCtx;.
7e30: 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74  struct t1CountCt
7e40: 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a  x {.  int n;.};.
7e50: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f  static void t1Co
7e60: 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  untStep(.  sqlit
7e70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7e80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7e90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7ea0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43   **argv.){.  t1C
7eb0: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7ec0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7ed0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ee0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7ef0: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
7f00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
7f10: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
7f20: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26  ype(argv[0]) ) &
7f30: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
7f40: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  +;.  }.  if( arg
7f50: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  c>0 ){.    int v
7f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7f70: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
7f80: 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a     if( v==40 ){.
7f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7fa0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
7fb0: 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30  xt, "value of 40
7fc0: 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75   handed to x_cou
7fd0: 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65  nt", -1);.#ifnde
7fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7ff0: 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F16.    }else if
8000: 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20  ( v==41 ){.     
8010: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66   const char zUtf
8020: 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30  16ErrMsg[] = { 0
8030: 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c  , 0x61, 0, 0x62,
8040: 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20   0, 0x63, 0, 0, 
8050: 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0};.      sqlite
8060: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36  3_result_error16
8070: 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31  (context, &zUtf1
8080: 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45  6ErrMsg[1-SQLITE
8090: 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29  _BIGENDIAN], -1)
80a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
80b0: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
80c0: 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c  oid t1CountFinal
80d0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
80e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
80f0: 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a   t1CountCtx *p;.
8100: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
8110: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8120: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
8130: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
8140: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34  .    if( p->n==4
8150: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
8160: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8170: 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e  context, "x_coun
8180: 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c  t totals to 42",
8190: 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   -1);.    }else{
81a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
81b0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
81c0: 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29  t, p ? p->n : 0)
81d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
81e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81f0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73 74  IT_DEPRECATED.st
8200: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
8210: 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c  CountStep(.  sql
8220: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8230: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8240: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8250: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f  ue **argv.){.  /
8260: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74  * no-op */.}..st
8270: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
8280: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
8290: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
82a0: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
82b0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
82c0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61  ntext, sqlite3_a
82d0: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63  ggregate_count(c
82e0: 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e 64  ontext));.}.#end
82f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
8300: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8310: 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a  _aggregate DB.**
8320: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
8330: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8340: 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20  tion API on the 
8350: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69  given database i
8360: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72  n order.** to cr
8370: 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  eate a function 
8380: 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e  named "x_count".
8390: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
83a0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
83b0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f   the built-in co
83c0: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20  unt() function, 
83d0: 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63 69  with a few speci
83e0: 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f 72  al quirks.** for
83f0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c   testing the sql
8400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8410: 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20  r() APIs..**.** 
8420: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
8430: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
8440: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
8450: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
8460: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
8470: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
8480: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
8490: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
84a0: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
84b0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
84c0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
84d0: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65  ction logic.  Se
84e0: 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a  e misuse.test..*
84f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8500: 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65  e was later exte
8510: 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  nded to test the
8520: 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   use of sqlite3_
8530: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a  result_error().*
8540: 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61  * within aggrega
8550: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  te functions..**
8560: 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69 73  .** Later: It is
8570: 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e 64   now also extend
8580: 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  ed to register t
8590: 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
85a0: 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63 79  ction.** "legacy
85b0: 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20 74  _count()" with t
85c0: 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74 61  he supplied data
85d0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
85e0: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
85f0: 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63 61  test the depreca
8600: 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72  ted sqlite3_aggr
8610: 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50  egate_count() AP
8620: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  I..*/.static int
8630: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67   test_create_agg
8640: 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  regate(.  void *
8650: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8660: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8670: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8680: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8690: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
86a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
86b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
86c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
86d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
86e0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
86f0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8700: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
8730: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8750: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8760: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8770: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8780: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
8790: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
87a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
87b0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
87c0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
87d0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
87e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
87f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
8800: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
8810: 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c  b, "x_count", 0,
8820: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
8830: 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75 6e   0,.      t1Coun
8840: 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e  tStep,t1CountFin
8850: 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  alize);.  if( rc
8860: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8870: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8880: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8890: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31  db, "x_count", 1
88a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
88b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31 43  , 0,.        t1C
88c0: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
88d0: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23  Finalize);.  }.#
88e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
88f0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
8900: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8910: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
8920: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8930: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61 63  ction(db, "legac
8940: 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  y_count", 0, SQL
8950: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a 20  ITE_ANY, 0, 0,. 
8960: 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f 75         legacyCou
8970: 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43 6f  ntStep, legacyCo
8980: 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20 20  untFinalize.    
8990: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
89a0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
89b0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
89c0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
89d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
89e0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
89f0: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
8a00: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
8a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8a20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
8a30: 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a 2a  :  printf TEXT.*
8a40: 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75 74  *.** Send output
8a50: 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73 65   to printf.  Use
8a60: 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68 61   this rather tha
8a70: 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65 20  n puts to merge 
8a80: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 6e  the output.** in
8a90: 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65 71   the correct seq
8aa0: 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75 67  uence with debug
8ab0: 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e 73  ging printfs ins
8ac0: 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f 64  erted into C cod
8ad0: 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73 20  e..** Puts uses 
8ae0: 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66 65  a separate buffe
8af0: 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  r and debugging 
8b00: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c 20  statements will 
8b10: 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65 71  be out of.** seq
8b20: 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20 75  uence if it is u
8b30: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
8b40: 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28 0a  nt test_printf(.
8b50: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
8b60: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8b70: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
8b80: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
8b90: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8ba0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
8bb0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
8bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8bd0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
8be0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
8c00: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
8c10: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61  nt */.){.  if( a
8c20: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
8c30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8c40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8c50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8c60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8c70: 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20       " TEXT\"", 
8c80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8c90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8ca0: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61  printf("%s\n", a
8cb0: 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72  rgv[1]);.  retur
8cc0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  n TCL_OK;.}..../
8cd0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8ce0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8cf0: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
8d00: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
8d10: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
8d20: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69 6e  tf with three in
8d30: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a  teger arguments.
8d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
8d50: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8d60: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8d70: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8d80: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8d90: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8da0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8db0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8dc0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8de0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8df0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8e00: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8e10: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8e20: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8e30: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8e40: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8e50: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8e60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8e70: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8e80: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8e90: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8ea0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8eb0: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8ed0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8ee0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8ef0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8f00: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8f10: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8f20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8f30: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8f40: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8f50: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8f60: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8f70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8f80: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8f90: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8fa0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8fb0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8fc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8fd0: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8fe0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8ff0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
9000: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
9010: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
9020: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
9030: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
9040: 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20  printf_int64(.  
9050: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
9060: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9070: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
9080: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
9090: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
90a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
90b0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
90e0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
9100: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
9110: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
9120: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61    sqlite_int64 a
9130: 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [3];.  char *z;.
9140: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
9150: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9160: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9170: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9180: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9190: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
91a0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
91b0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
91c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
91d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
91e0: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
91f0: 20 21 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28   !sqlite3Atoi64(
9200: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
9210: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
9220: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9230: 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69 73  rp, "argument is
9240: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34 2d   not a valid 64-
9250: 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30 29  bit integer", 0)
9260: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9270: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9280: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9290: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
92a0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
92b0: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
92c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
92d0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
92e0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
92f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9300: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9310: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
9320: 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  g FORMAT INTEGER
9330: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9340: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9350: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 6c  ntf with three l
9360: 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75  ong integer argu
9370: 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d 69  ments.   This mi
9380: 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ght be the.** sa
9390: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d 70  me as sqlite3_mp
93a0: 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c  rintf_int or sql
93b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
93c0: 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  64, depending on
93d0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f  .** platform..*/
93e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
93f0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
9400: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9410: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9420: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9430: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9440: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9450: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9460: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9480: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9490: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
94b0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
94c0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
94d0: 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61   i;.  long int a
94e0: 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b  [3];.  int b[3];
94f0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9500: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
9510: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9520: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9530: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9540: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9550: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9560: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
9570: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9580: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9590: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
95a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
95b0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
95c0: 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d  argv[i], &b[i-2]
95d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
95e0: 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  RROR;.    a[i-2]
95f0: 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69   = (long int)b[i
9600: 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20  -2];.    a[i-2] 
9610: 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28 73  &= (((u64)1)<<(s
9620: 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31  izeof(int)*8))-1
9630: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
9640: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
9650: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
9660: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
9670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9680: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9690: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
96a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
96b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
96c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
96d0: 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  tr FORMAT INTEGE
96e0: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
96f0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9700: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9710: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9720: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
9730: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9740: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
9750: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9760: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9770: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9780: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9790: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
97a0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
97b0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
97c0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
97d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
97e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
97f0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
9800: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9810: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9820: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9830: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9840: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9850: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9860: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9870: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9880: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9890: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
98a0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
98b0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
98c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
98d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
98e0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
98f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9900: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9910: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9920: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9930: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9940: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9950: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9960: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9970: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9980: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9990: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
99a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
99b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
99c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
99d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
99e0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
99f0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
9a00: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9a10: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9a20: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9a30: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9a40: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9a50: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9a60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  int sqlite3_snpr
9a70: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9a80: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9a90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9aa0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9ab0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9ac0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9ad0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9ae0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9b00: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
9b10: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
9b20: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9b30: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9b40: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9b50: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
9b60: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9b70: 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a  <5 || argc>6 ){.
9b80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9b90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9ba0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9bb0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9bc0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54  0],.       " INT
9bd0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
9be0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
9bf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9c00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9c10: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9c20: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  rp, argv[1], &n)
9c30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9c40: 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  ROR;.  if( n<0 )
9c50: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9c60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9c70: 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  N must be non-ne
9c80: 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20  gative", 0);.   
9c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9ca0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33  R;.  }.  for(i=3
9cb0: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
9cc0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
9cd0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
9ce0: 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75   &a[i-3]) ) retu
9cf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9d00: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
9d10: 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  malloc( n+1 );. 
9d20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9d30: 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c  f(n, z, argv[2],
9d40: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67   a[0], a[1], arg
9d50: 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20  c>4 ? argv[5] : 
9d60: 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70  NULL);.  Tcl_App
9d70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9d80: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9d90: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9da0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9db0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9dc0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
9dd0: 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45  uble FORMAT INTE
9de0: 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42  GER INTEGER DOUB
9df0: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
9e00: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
9e10: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9e20: 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20   and one double 
9e30: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9e40: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
9e50: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20  printf_double(. 
9e60: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9e70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9e80: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9e90: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9ea0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9eb0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9ec0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9ed0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9ee0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9ef0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9f10: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9f20: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9f30: 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  3], i;.  double 
9f40: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  r;.  char *z;.  
9f50: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
9f60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9f70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9f80: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9f90: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9fa0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9fb0: 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c  AT INT INT DOUBL
9fc0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
9fd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9fe0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9ff0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
a000: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
a010: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
a020: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
a030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a040: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
a050: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
a060: 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e  4], &r) ) return
a070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20   TCL_ERROR;.  z 
a080: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a090: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
a0a0: 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c   a[1], r);.  Tcl
a0b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a0c0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
a0d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
a0e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
a100: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
a110: 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20  f_scaled FORMAT 
a120: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a  DOUBLE DOUBLE.**
a130: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
a140: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64   with a single d
a150: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ouble argument w
a160: 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64  hich is the prod
a170: 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  uct of the.** tw
a180: 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65  o arguments give
a190: 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69  n above.  This i
a1a0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
a1b0: 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20  te overflow and 
a1c0: 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75  underflow.** dou
a1d0: 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61  bles to test tha
a1e0: 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65  t they are conve
a1f0: 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  rted properly..*
a200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
a210: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
a220: 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  led(.  void *Not
a230: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a240: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a250: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a260: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a270: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a280: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a2a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a2b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a2c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a2d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a2e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a2f0: 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  int i;.  double 
a300: 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  r[2];.  char *z;
a310: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29  .  if( argc!=4 )
a320: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a330: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a340: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a350: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
a360: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
a370: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
a380: 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  BLE\"", 0);.    
a390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a3a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
a3b0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
a3c0: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
a3d0: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  e(interp, argv[i
a3e0: 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65  ], &r[i-2]) ) re
a3f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a400: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
a410: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
a420: 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20  ], r[0]*r[1]);. 
a430: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a440: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a450: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a460: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a480: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a490: 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f  rintf_stronly FO
a4a0: 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a  RMAT STRING.**.*
a4b0: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a4c0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a4d0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a4e0: 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63  ch is the produc
a4f0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  t of the.** two 
a500: 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20  arguments given 
a510: 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20  above.  This is 
a520: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
a530: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e   overflow and un
a540: 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c  derflow.** doubl
a550: 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  es to test that 
a560: 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74  they are convert
a570: 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ed properly..*/.
a580: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
a590: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
a5a0: 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ly(.  void *NotU
a5b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a5c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a5d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a5e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a5f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a600: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a620: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a630: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a640: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a650: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a660: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
a670: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a680: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
a690: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a6a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a6b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a6c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a6d0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52      " FORMAT STR
a6e0: 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ING\"", 0);.    
a6f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a700: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
a710: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a720: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20  [1], argv[2]);. 
a730: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a740: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a750: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a760: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a770: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a780: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a790: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20  rintf_hexdouble 
a7a0: 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a  FORMAT HEX.**.**
a7b0: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a7c0: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a7d0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a7e0: 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f  h is derived fro
a7f0: 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63  m the.** hexadec
a800: 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66  imal encoding of
a810: 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e   an IEEE double.
a820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a830: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
a840: 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  exdouble(.  void
a850: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
a860: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a870: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a880: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a890: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a8a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
a8b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
a8c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a8d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a8e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a8f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a900: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a910: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
a920: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69  double r;.  unsi
a930: 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b  gned int x1, x2;
a940: 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  .  sqlite_uint64
a950: 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   d;.  if( argc!=
a960: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
a970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a980: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a990: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
a9a0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
a9b0: 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c  " FORMAT STRING\
a9c0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
a9d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a9e0: 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28 61  }.  if( sscanf(a
a9f0: 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38  rgv[2], "%08x%08
aa00: 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32  x", &x2, &x1)!=2
aa10: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
aa20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aa30: 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73   "2nd argument s
aa40: 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72  hould be 16-char
aa50: 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20  acters of hex", 
aa60: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
aa70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
aa80: 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64  d = x2;.  d = (d
aa90: 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65  <<32) + x1;.  me
aaa0: 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a  mcpy(&r, &d, siz
aab0: 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73  eof(r));.  z = s
aac0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
aad0: 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  rgv[1], r);.  Tc
aae0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
aaf0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
ab00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
ab10: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ab20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ab30: 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  : sqlite3_enable
ab40: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42  _shared_cache ?B
ab50: 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69  OOLEAN?.**.*/.#i
ab60: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ab70: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ab80: 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20  CHE).static int 
ab90: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72  test_enable_shar
aba0: 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ed(.  ClientData
abb0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
abc0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
abd0: 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
abe0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
abf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ac00: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
ac10: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
ac20: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
ac30: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
ac40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ac50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ac60: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
ac70: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ac80: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
ac90: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
aca0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e  int rc;.  int en
acb0: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20  able;.  int ret 
acc0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
acd0: 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29  !=2 && objc!=1 )
ace0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
acf0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ad00: 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41  , objv, "?BOOLEA
ad10: 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
ad20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ad30: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 47    ret = sqlite3G
ad40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
ad50: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a  edCacheEnabled;.
ad60: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
ad70: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
ad80: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
ad90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
ada0: 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20   &enable) ){.   
adb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
adc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
add0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  c = sqlite3_enab
ade0: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28  le_shared_cache(
adf0: 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  enable);.    if(
ae00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ae10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
ae20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
ae30: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
ae40: 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  Str(rc), TCL_STA
ae50: 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  TIC);.      retu
ae60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ae70: 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65    }.  }.  Tcl_Se
ae80: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ae90: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
aea0: 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65  nObj(ret));.  re
aeb0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
aec0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  endif..../*.** U
aed0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
aee0: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
aef0: 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c  des   DB    BOOL
af00: 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  EAN.**.*/.static
af10: 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64   int test_extend
af20: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
af30: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
af40: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
af50: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
af60: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
af70: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
af80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
af90: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
afa0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
afb0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
afc0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afe0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
aff0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b000: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b010: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b020: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
b030: 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74   enable;.  sqlit
b040: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f  e3 *db;..  if( o
b050: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
b060: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b070: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b080: 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  "DB BOOLEAN");. 
b090: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b0a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
b0b0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
b0c0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b0d0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
b0e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b0f0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
b100: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
b110: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b120: 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74  , &enable) ) ret
b130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b140: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
b150: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64  d_result_codes(d
b160: 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65  b, enable);.  re
b170: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
b180: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b190: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
b1a0: 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61  number.**.*/.sta
b1b0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62  tic int test_lib
b1c0: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b1d0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b1e0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b1f0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b200: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b210: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b220: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b230: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b240: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b250: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b260: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b280: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b290: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b2a0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b2b0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b2c0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b2d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b2e0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b2f0: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b300: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b310: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b320: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b330: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b340: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b350: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b360: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b380: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b390: 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74  ADATA.static int
b3a0: 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
b3b0: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43  mn_metadata(.  C
b3c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
b3d0: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
b3e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
b3f0: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
b400: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
b410: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
b420: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
b430: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
b440: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
b450: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
b460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b470: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b480: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b490: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b4a0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b4b0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b4c0: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
b4d0: 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74  ar *zDb;.  const
b4e0: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
b4f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b  onst char *zCol;
b500: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c  .  int rc;.  Tcl
b510: 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63  _Obj *pRet;..  c
b520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
b530: 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  type;.  const ch
b540: 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20  ar *zCollseq;.  
b550: 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  int notnull;.  i
b560: 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20  nt primarykey;. 
b570: 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65   int autoincreme
b580: 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  nt;..  if( objc!
b590: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
b5a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b5b0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
b5c0: 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63  dbname tblname c
b5d0: 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65  olname");.    re
b5e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5f0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
b600: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
b610: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b620: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
b630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b640: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
b650: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
b660: 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74    zTbl = Tcl_Get
b670: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
b680: 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65  .  zCol = Tcl_Ge
b690: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
b6a0: 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28  ;..  if( strlen(
b6b0: 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20  zDb)==0 ) zDb = 
b6c0: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
b6d0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
b6e0: 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62  metadata(db, zDb
b6f0: 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20  , zTbl, zCol, . 
b700: 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c       &zDatatype,
b710: 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74   &zCollseq, &not
b720: 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65  null, &primaryke
b730: 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e  y, &autoincremen
b740: 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  t);..  if( rc!=S
b750: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b760: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b770: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
b780: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
b790: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b7a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52  ERROR;.  }..  pR
b7b0: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
b7c0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b7d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b7e0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b7f0: 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70  ringObj(zDatatyp
b800: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  e, -1));.  Tcl_L
b810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43  _NewStringObj(zC
b840: 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20  ollseq, -1));.  
b850: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b860: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
b870: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
b880: 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c  notnull));.  Tcl
b890: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b8a0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b8b0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69  cl_NewIntObj(pri
b8c0: 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c  marykey));.  Tcl
b8d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b8e0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b8f0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74  cl_NewIntObj(aut
b900: 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20  oincrement));.  
b910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b920: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
b930: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b940: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
b950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b960: 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20  INCRBLOB../*.** 
b970: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
b980: 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  d  CHANNEL OFFSE
b990: 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  T N.**.**   This
b9a0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
b9b0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
b9c0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
b9d0: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
b9e0: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
b9f0: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
ba00: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
ba10: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
ba20: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
ba30: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
ba40: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
ba50: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
ba60: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
ba70: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
ba80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
ba90: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
baa0: 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f  b_read().**   to
bab0: 20 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72   read N bytes fr
bac0: 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54  om offset OFFSET
bad0: 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
bae0: 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20  ying SQLite.**  
baf0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
bb00: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
bb10: 2c 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f  , a byte-array o
bb20: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
bb30: 20 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69   the read data i
bb40: 73 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64  s .**   returned
bb50: 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  . On failure, th
bb60: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  e interpreter re
bb70: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
bb80: 68 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70  he.**   text rep
bb90: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
bba0: 68 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  he returned erro
bbb0: 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51  r code (i.e. "SQ
bbc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20  LITE_NOMEM").** 
bbd0: 20 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65    and a Tcl exce
bbe0: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
bbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
bc00: 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  est_blob_read(. 
bc10: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
bc20: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
bc30: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
bc40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
bc50: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
bc60: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
bc70: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
bc80: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bca0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bcb0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
bcc0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
bcd0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
bce0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
bcf0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
bd00: 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  ;.  ClientData i
bd10: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73  nstanceData;.  s
bd20: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
bd30: 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65  ob;.  int notUse
bd40: 64 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  d;.  int nByte;.
bd50: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
bd60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bd70: 7a 42 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zBuf;.  int rc;.
bd80: 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
bd90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
bda0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
bdb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
bdc0: 45 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20  EL OFFSET N");. 
bdd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bde0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e  ROR;.  }..  chan
bdf0: 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  nel = Tcl_GetCha
be00: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
be10: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
be20: 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  1]), &notUsed);.
be30: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20    if( !channel. 
be40: 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c    || TCL_OK!=Tcl
be50: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
be60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
be70: 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20  &iOffset).   || 
be80: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
be90: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bea0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74  , objv[3], &nByt
beb0: 65 29 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c 30  e).   || nByte<0
bec0: 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20   || iOffset<0.  
bed0: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ){ .    return T
bee0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
bef0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20   instanceData = 
bf00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
bf10: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e  stanceData(chann
bf20: 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a  el);.  pBlob = *
bf30: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
bf40: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
bf50: 0a 0a 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69  ..  zBuf = (unsi
bf60: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
bf70: 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  Alloc(nByte);.  
bf80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
bf90: 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42  b_read(pBlob, zB
bfa0: 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73  uf, nByte, iOffs
bfb0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
bfc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bfd0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
bfe0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
bff0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75  ByteArrayObj(zBu
c000: 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65  f, nByte));.  }e
c010: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  lse{.    Tcl_Set
c020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
c030: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
c040: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
c050: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c060: 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28    }.  Tcl_Free((
c070: 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20  char *)zBuf);.. 
c080: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
c090: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
c0a0: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
c0b0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
c0c0: 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e 45  lob_write CHANNE
c0d0: 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f 4e  L OFFSET DATA ?N
c0e0: 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68  DATA?.**.**   Th
c0f0: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
c100: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 73  ed to test the s
c110: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
c120: 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  e() in ways that
c130: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
c140: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
c150: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
c160: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
c170: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
c180: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
c190: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
c1a0: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
c1b0: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
c1c0: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
c1d0: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
c1e0: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
c1f0: 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20  blob_write().** 
c200: 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 44    to write the D
c210: 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20 74  ATA byte-array t
c220: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
c230: 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e   SQLite blob han
c240: 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66  dle..**   at off
c250: 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  set OFFSET..**.*
c260: 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  *   On success, 
c270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
c280: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20  is returned. On 
c290: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74  failure, the int
c2a0: 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72 65  erpreter.**   re
c2b0: 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74  sult is set to t
c2c0: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
c2d0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  tation of the re
c2e0: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64  turned error cod
c2f0: 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53  e .**   (i.e. "S
c300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e  QLITE_NOMEM") an
c310: 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  d a Tcl exceptio
c320: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a  n is thrown..*/.
c330: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
c340: 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43 6c  blob_write(.  Cl
c350: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
c360: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
c370: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
c380: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
c390: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
c3a0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
c3b0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
c3c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
c3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c3e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c3f0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
c400: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
c410: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
c420: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68  s */.){.  Tcl_Ch
c430: 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20  annel channel;. 
c440: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
c450: 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69  anceData;.  sqli
c460: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
c470: 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a  .  int notUsed;.
c480: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
c490: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69   int rc;..  unsi
c4a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b  gned char *zBuf;
c4b0: 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a  .  int nBuf;.  .
c4c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
c4d0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
c4e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c4f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c500: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
c510: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22 29  T DATA ?NDATA?")
c520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c530: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63  _ERROR;.  }..  c
c540: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
c550: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
c560: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c570: 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64  jv[1]), &notUsed
c580: 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65  );.  if( !channe
c590: 6c 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c  l || TCL_OK!=Tcl
c5a0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
c5b0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
c5c0: 26 69 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20  &iOffset) ){ .  
c5d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c5e0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61  OR;.  }..  insta
c5f0: 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65  nceData = Tcl_Ge
c600: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
c610: 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  Data(channel);. 
c620: 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69   pBlob = *((sqli
c630: 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74  te3_blob **)inst
c640: 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42  anceData);..  zB
c650: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
c660: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
c670: 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20  v[3], &nBuf);.  
c680: 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 54  if( objc==5 && T
c690: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
c6a0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
c6b0: 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20  , &nBuf) ){.    
c6c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c6d0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
c6e0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
c6f0: 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75  pBlob, zBuf, nBu
c700: 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  f, iOffset);.  i
c710: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c720: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
c730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c740: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
c750: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
c760: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
c770: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
c780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43  ==SQLITE_OK ? TC
c790: 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
c7a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
c7b0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
c7c0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
c7d0: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
c7e0: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
c7f0: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
c800: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
c810: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c820: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
c830: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
c840: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
c850: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
c860: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
c870: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
c880: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
c890: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
c8a0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
c8b0: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
c8c0: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
c8d0: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
c8e0: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
c8f0: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c900: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
c910: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
c920: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
c930: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
c940: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
c950: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
c960: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
c970: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
c980: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
c990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
c9a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
c9b0: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
c9c0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
c9d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c9e0: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
c9f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
ca00: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
ca10: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
ca20: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
ca30: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
ca40: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
ca50: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
ca60: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
ca70: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
ca80: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
ca90: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
caa0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
cab0: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
cac0: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
cad0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
cae0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
caf0: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
cb00: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
cb10: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
cb20: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
cb30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
cb40: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
cb50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
cb60: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
cb70: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
cb80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
cb90: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
cba0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
cbb0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
cbc0: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
cbd0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
cbe0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
cbf0: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
cc00: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
cc10: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
cc20: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
cc30: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
cc40: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
cc50: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
cc60: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
cc70: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
cc80: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
cc90: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
cca0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
ccb0: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
ccc0: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
ccd0: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
cce0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
ccf0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
cd00: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
cd10: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
cd20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
cd30: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
cd40: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
cd50: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
cd60: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cd80: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
cd90: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
cda0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
cdb0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
cdc0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
cdd0: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
cde0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
cdf0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
ce00: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
ce10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ce20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
ce30: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
ce40: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
ce50: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
ce60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ce70: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
ce80: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ce90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
cea0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
ceb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
cec0: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
ced0: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
cee0: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
cef0: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
cf00: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
cf10: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
cf20: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
cf30: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
cf40: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
cf50: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
cf60: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
cf70: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
cf80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
cf90: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
cfa0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cfb0: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
cfc0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
cfd0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
cfe0: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
cff0: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
d000: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d010: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
d020: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d030: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
d040: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
d050: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
d060: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
d070: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
d080: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
d090: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d0a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
d0b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d0c0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
d0d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d0e0: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
d0f0: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
d100: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
d110: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
d120: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
d130: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
d140: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d150: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
d160: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
d170: 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49  ion DB-HANDLE FI
d180: 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61  LE ?PROC?.*/.sta
d190: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61  tic int test_loa
d1a0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43  d_extension(.  C
d1b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d1c0: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
d1d0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
d1e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
d1f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
d200: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
d210: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
d220: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
d230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d240: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d250: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
d260: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
d270: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
d280: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
d290: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
d2a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d2b0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
d2c0: 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46  *zDb;.  char *zF
d2d0: 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72  ile;.  char *zPr
d2e0: 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  oc = 0;.  char *
d2f0: 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zErr = 0;..  if(
d300: 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
d310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
d320: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d330: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
d340: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
d350: 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OC?");.    retur
d360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d370: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
d380: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
d390: 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
d3a0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
d3b0: 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34  );.  if( objc==4
d3c0: 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20   ){.    zProc = 
d3d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d3e0: 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  jv[3]);.  }..  /
d3f0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20  * Extract the C 
d400: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
d410: 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d  from the Tcl com
d420: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  mand name */.  i
d430: 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
d440: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
d450: 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  Db, &cmdInfo) ){
d460: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
d470: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
d480: 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64  ommand not found
d490: 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a  : ", zDb, (char*
d4a0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
d4b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d4c0: 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53   db = ((struct S
d4d0: 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
d4e0: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d  .objClientData)-
d4f0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62  >db;.  assert(db
d500: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68  );..  /* Call th
d510: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66  e underlying C f
d520: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  unction. If an e
d530: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
d540: 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c   rc to .  ** TCL
d550: 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20  _ERROR and load 
d560: 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67  any error string
d570: 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70   into the interp
d580: 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20  reter. If no .  
d590: 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  ** error occurs,
d5a0: 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f   set rc to TCL_O
d5b0: 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  K..  */.#ifdef S
d5c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
d5d0: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d  EXTENSION.  rc =
d5e0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d5f0: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
d600: 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62 75  mprintf("this bu
d610: 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65  ild omits sqlite
d620: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d630: 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  ()");.#else.  rc
d640: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f   = sqlite3_load_
d650: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46  extension(db, zF
d660: 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
d670: 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  r);.#endif.  if(
d680: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d690: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
d6a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
d6b0: 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43   ? zErr : "", TC
d6c0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
d6d0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
d6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d6f0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20   = TCL_OK;.  }. 
d700: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
d710: 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  rr);..  return r
d720: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  c;.}../*.** Usag
d730: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
d740: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
d750: 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46   DB-HANDLE ONOFF
d760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d770: 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28  est_enable_load(
d780: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
d790: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
d7a0: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
d7b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
d7c0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
d7d0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
d7e0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
d7f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
d800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d810: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
d820: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
d830: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
d840: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
d850: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
d860: 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
d870: 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
d880: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  b;.  char *zDb;.
d890: 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20    int onoff;..  
d8a0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
d8b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d8c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d8d0: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
d8e0: 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74  ONOFF");.    ret
d8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d900: 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47   }.  zDb = Tcl_G
d910: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
d920: 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  );..  /* Extract
d930: 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20   the C database 
d940: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
d950: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
d960: 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47   */.  if( !Tcl_G
d970: 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
d980: 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49  terp, zDb, &cmdI
d990: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
d9a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d9b0: 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f  erp, "command no
d9c0: 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c  t found: ", zDb,
d9d0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
d9e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d9f0: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73  ;.  }.  db = ((s
da00: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
da10: 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
da20: 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73  tData)->db;.  as
da30: 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  sert(db);..  /* 
da40: 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61  Get the onoff pa
da50: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28  rameter */.  if(
da60: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
da70: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
da80: 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20  bjv[2], &onoff) 
da90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
daa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69  L_ERROR;.  }..#i
dab0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
dac0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
dad0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
dae0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73  lt(interp, "this
daf0: 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c   build omits sql
db00: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
db10: 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72  ion()");.  retur
db20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
db30: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  se.  sqlite3_ena
db40: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
db50: 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  on(db, onoff);. 
db60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
db70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
db80: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61  Usage:  sqlite_a
db90: 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64  bort.**.** Shutd
dba0: 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  own the process 
dbb0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68  immediately.  Th
dbc0: 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61  is is not a clea
dbd0: 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54  n shutdown..** T
dbe0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
dbf0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
dc00: 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f  recoverability o
dc10: 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a  f a database in.
dc20: 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  ** the event of 
dc30: 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e  a program crash.
dc40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
dc50: 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20 76  qlite_abort(.  v
dc60: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
dc70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
dc80: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
dc90: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
dca0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
dcb0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
dcc0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
dcd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dce0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
dcf0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
dd00: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
dd10: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
dd20: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
dd30: 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f  interp==0 );   /
dd40: 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61  * This will alwa
dd50: 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74  ys fail */.  ret
dd60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
dd70: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
dd80: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ng routine is a 
dd90: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c  user-defined SQL
dda0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20   function whose 
ddb0: 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f  purpose.** is to
ddc0: 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   test the sqlite
ddd0: 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50  _set_result() AP
dde0: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  I..*/.static voi
ddf0: 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74  d testFunc(sqlit
de00: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
de10: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
de20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
de30: 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61  rgv){.  while( a
de40: 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f  rgc>=2 ){.    co
de50: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20  nst char *zArg0 
de60: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
de70: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
de80: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41  [0]);.    if( zA
de90: 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rg0 ){.      if(
dea0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
deb0: 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29  mp(zArg0, "int")
dec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ded0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
dee0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
def0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
df00: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
df10: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
df20: 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34  Cmp(zArg0,"int64
df30: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
df40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
df50: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73  int64(context, s
df60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
df70: 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  64(argv[1]));.  
df80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
df90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
dfa0: 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20  g0,"string")==0 
dfb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dfc0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
dfd0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
dfe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
dff0: 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a  t(argv[1]), -1,.
e000: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e010: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
e020: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e030: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
e040: 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  rg0,"double")==0
e050: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e060: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
e070: 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  e(context, sqlit
e080: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
e090: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e0a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e0b0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e0c0: 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
e0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e0e0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
e0f0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
e100: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e110: 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22  mp(zArg0,"value"
e120: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
e140: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
e150: 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  gv[sqlite3_value
e160: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b  _int(argv[1])]);
e170: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e180: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
e190: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
e1a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
e1b0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e1c0: 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d     }.    argc -=
e1d0: 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20   2;.    argv += 
e1e0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  2;.  }.  return;
e1f0: 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
e200: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
e210: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72  ror(context,"fir
e220: 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  st argument shou
e230: 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a  ld be one of: ".
e240: 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34        "int int64
e250: 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e   string double n
e260: 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b  ull value", -1);
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e280: 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74     sqlite_regist
e290: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
e2a0: 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a    DB  NAME.**.**
e2b0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 74 65   Register the te
e2c0: 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  st SQL function 
e2d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e2e0: 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d  DB under the nam
e2f0: 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69  e NAME..*/.stati
e300: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73  c int test_regis
e310: 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ter_func(.  void
e320: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
e330: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e340: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e350: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e360: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e370: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
e380: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
e390: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e3a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
e3b0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
e3c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
e3d0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
e3e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e3f0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
e400: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
e410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e420: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e430: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e440: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
e450: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 55   .       " DB FU
e460: 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29  NCTION-NAME", 0)
e470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e480: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
e490: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
e4a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
e4b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
e4c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
e4d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e4e0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  unction(db, argv
e4f0: 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [2], -1, SQLITE_
e500: 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20  UTF8, 0, .      
e510: 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  testFunc, 0, 0);
e520: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
e530: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e540: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
e550: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
e560: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e570: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
e580: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
e590: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
e5a0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
e5b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
e5c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
e5d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
e5e0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53  ite3_finalize  S
e5f0: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  TMT .**.** Final
e600: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ize a statement 
e610: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
e620: 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c  c int test_final
e630: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
e640: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e650: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e660: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e670: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e680: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
e690: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
e6a0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
e6b0: 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66  3 *db = 0;..  if
e6c0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
e6d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e6e0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e6f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e700: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
e710: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e720: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
e730: 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
e740: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e750: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e760: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e770: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e780: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e790: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e7a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
e7b0: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
e7c0: 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70   db = StmtToDb(p
e7d0: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  Stmt);.  }.  rc 
e7e0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
e7f0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ze(pStmt);.  Tcl
e800: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
e810: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
e820: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
e830: 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64  STATIC);.  if( d
e840: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74  b && sqlite3Test
e850: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
e860: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
e870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
e880: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
e890: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
e8a0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
e8b0: 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52  s  STMT  CODE  R
e8c0: 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47  ESETFLAG.**.** G
e8d0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
e8e0: 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72  a status counter
e8f0: 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e   from a statemen
e900: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e910: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
e920: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
e930: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
e940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
e950: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
e960: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e970: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
e980: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 2c 20  e;.  int i, op, 
e990: 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f 6e  resetFlag;.  con
e9a0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
e9b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
e9c0: 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61 74   *pStmt;..  stat
e9d0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
e9e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
e9f0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
ea00: 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d   op;.  } aOp[] =
ea10: 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45   {.    { "SQLITE
ea20: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
ea30: 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20 53 51  SCAN_STEP",   SQ
ea40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ea50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20 20  FULLSCAN_STEP   
ea60: 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
ea70: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
ea80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
ea90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eaa0: 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SORT            
eab0: 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
eac0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
ead0: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 53 51  INDEX",       SQ
eae0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eaf0: 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20 20 20  AUTOINDEX       
eb00: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f 62  },.  };.  if( ob
eb10: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
eb20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
eb30: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
eb40: 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52 20 52  STMT PARAMETER R
eb50: 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20 20 20  ESETFLAG");.    
eb60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eb70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
eb80: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
eb90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
eba0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ebb0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ebc0: 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65  ERROR;.  zOpName
ebd0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ebe0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (objv[2]);.  for
ebf0: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
ec00: 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  e(aOp); i++){.  
ec10: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 4f 70    if( strcmp(aOp
ec20: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61  [i].zName, zOpNa
ec30: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
ec40: 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a  op = aOp[i].op;.
ec50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ec60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d   }.  }.  if( i>=
ec70: 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 20 29  ArraySize(aOp) )
ec80: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
ec90: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
eca0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70  rp, objv[2], &op
ecb0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ecc0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ecd0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
ece0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ecf0: 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c 61  jv[3], &resetFla
ed00: 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  g) ) return TCL_
ed10: 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65 20  ERROR;.  iValue 
ed20: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
ed30: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f 70 2c  tatus(pStmt, op,
ed40: 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 54   resetFlag);.  T
ed50: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ed60: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
ed70: 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b 0a  ntObj(iValue));.
ed80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ed90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
eda0: 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73    sqlite3_next_s
edb0: 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a  tmt  DB  STMT.**
edc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
edd0: 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e 20  ext statment in 
ede0: 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 53  sequence after S
edf0: 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
ee00: 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d  nt test_next_stm
ee10: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
ee20: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee40: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee50: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee60: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
ee70: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71  tmt *pStmt;.  sq
ee80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20  lite3 *db = 0;. 
ee90: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
eea0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
eeb0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
eec0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
eed0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
eee0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
eef0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
ef00: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
ef10: 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54  ], 0), " DB STMT
ef20: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
ef30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ef40: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
ef50: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
ef60: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ef70: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
ef80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ef90: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
efa0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
efb0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
efc0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
efd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
efe0: 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   pStmt = sqlite3
eff0: 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70  _next_stmt(db, p
f000: 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74  Stmt);.  if( pSt
f010: 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
f020: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
f030: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
f040: 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
f050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f060: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
f070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
f080: 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
f090: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f0a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
f0b0: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54  qlite3_reset  ST
f0c0: 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20  MT .**.** Reset 
f0d0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
f0e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
f0f0: 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20  t test_reset(.  
f100: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f110: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f120: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f130: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f140: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f150: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f160: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
f170: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
f180: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f1a0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f1b0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
f1c0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
f1d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f1e0: 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
f1f0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f200: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f210: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f220: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f230: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f240: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f250: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f260: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
f270: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
f280: 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20  .  if( pStmt && 
f290: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
f2a0: 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
f2b0: 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
f2c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
f2d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
f2e0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f2f0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
f300: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
f310: 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20  L_STATIC);./*.  
f320: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
f330: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f340: 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20    }.*/.  return 
f350: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f360: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f370: 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a  _expired STMT .*
f380: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
f390: 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74   if a recompilat
f3a0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
f3b0: 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e  ment is recommen
f3c0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
f3d0: 6e 74 20 74 65 73 74 5f 65 78 70 69 72 65 64 28  nt test_expired(
f3e0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
f3f0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
f400: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
f410: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
f420: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
f430: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f440: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
f450: 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  D.  sqlite3_stmt
f460: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f   *pStmt;.  if( o
f470: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
f480: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f490: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
f4a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
f4b0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
f4c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f4d0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
f4e0: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
f4f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f500: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
f510: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f520: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f530: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
f540: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
f550: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
f560: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f570: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
f580: 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78  anObj(sqlite3_ex
f590: 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a  pired(pStmt)));.
f5a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
f5b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f5c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f5d0: 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
f5e0: 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54  gs FROMSTMT TOST
f5f0: 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  MT.**.** Transfe
f600: 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66  r all bindings f
f610: 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65  rom FROMSTMT ove
f620: 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73  r to TOSTMT.*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
f640: 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20  ransfer_bind(.  
f650: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f660: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f670: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f680: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f690: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f6b0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
f6c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f6d0: 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a  Stmt1, *pStmt2;.
f6e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
f6f0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
f700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
f710: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
f720: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
f730: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
f740: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
f750: 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d  , 0), " FROM-STM
f760: 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a  T TO-STMT", 0);.
f770: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f780: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f790: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f7a0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f7b0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f7c0: 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20  pStmt1)) return 
f7d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
f7e0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
f7f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
f800: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
f810: 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e  &pStmt2)) return
f820: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
f830: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
f840: 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
f850: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
f860: 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  e3_transfer_bind
f870: 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d  ings(pStmt1,pStm
f880: 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t2)));.#endif.  
f890: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
f8b0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20  sqlite3_changes 
f8c0: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
f8d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
f8e0: 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
f8f0: 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
f900: 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78  e last SQL.** ex
f910: 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ecution..*/.stat
f920: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e  ic int test_chan
f930: 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ges(.  void * cl
f940: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
f950: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
f960: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
f970: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
f980: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
f990: 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
f9a0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
f9b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f9c0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
f9d0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
f9e0: 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ,.       Tcl_Get
f9f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
fa00: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
fa10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fa20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
fa30: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
fa40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
fa50: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
fa60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fa70: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
fa80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
fa90: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
faa0: 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29  e3_changes(db)))
fab0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
fac0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
fad0: 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63 5f   is the "static_
fae0: 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74  bind_value" that
faf0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
fb00: 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20  ound to when.** 
fb10: 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20  the FLAG option 
fb20: 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  of sqlite3_bind 
fb30: 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73  is "static".*/.s
fb40: 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69  tatic char *sqli
fb50: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
fb60: 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  alue = 0;.static
fb70: 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74   int sqlite_stat
fb80: 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20  ic_bind_nbyte = 
fb90: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  0;../*.** Usage:
fba0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20    sqlite3_bind  
fbb0: 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20 20  VM  IDX  VALUE  
fbc0: 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73  FLAGS.**.** Sets
fbd0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
fbe0: 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72 61 6e  e IDX-th occuran
fbf0: 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65  ce of "?" in the
fc00: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a   original SQL.**
fc10: 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20   string.  VALUE 
fc20: 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  is the new value
fc30: 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75  .  If FLAGS=="nu
fc40: 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69  ll" then VALUE i
fc50: 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64  s.** ignored and
fc60: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
fc70: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46  t to NULL.  If F
fc80: 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74  LAGS=="static" t
fc90: 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
fca0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
fcb0: 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69 63  alue of a static
fcc0: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a   variable named.
fcd0: 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  ** "sqlite_stati
fce0: 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20  c_bind_value".  
fcf0: 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61  If FLAGS=="norma
fd00: 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a  l" then a copy.*
fd10: 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69  * of the VALUE i
fd20: 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47  s made.  If FLAG
fd30: 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e  S=="blob10" then
fd40: 20 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f   a VALUE is igno
fd50: 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62  red.** an a 10-b
fd60: 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30  yte blob "abc\00
fd70: 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69  0xyz\000pq" is i
fd80: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  nserted..*/.stat
fd90: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
fda0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
fdb0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
fdc0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
fdd0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
fde0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
fdf0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
fe00: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
fe10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fe20: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
fe30: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fe50: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
fe60: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
fe70: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
fe80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
fe90: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67  t idx;.  if( arg
fea0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
feb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fec0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
fed0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
fee0: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
fef0: 20 20 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c      " VM IDX VAL
ff00: 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c  UE (null|static|
ff10: 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a  normal)\"", 0);.
ff20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ff30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ff40: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
ff50: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
ff60: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
ff70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
ff80: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
ff90: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69  erp, argv[2], &i
ffa0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
ffb0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74  _ERROR;.  if( st
ffc0: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75  rcmp(argv[4],"nu
ffd0: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ll")==0 ){.    r
ffe0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
fff0: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78  _null(pStmt, idx
10000 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
10010 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73  trcmp(argv[4],"s
10020 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20  tatic")==0 ){.  
10030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
10040 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
10050 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
10060 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d  ic_bind_value, -
10070 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  1, 0);.  }else i
10080 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
10090 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73  ],"static-nbytes
100a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
100b0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
100c0 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
100d0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
100e0 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  nd_value,.      
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
10120 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20  ind_nbyte, 0);. 
10130 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10140 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61  p(argv[4],"norma
10150 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  l")==0 ){.    rc
10160 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
10170 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
10180 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51   argv[3], -1, SQ
10190 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
101a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
101b0 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f  cmp(argv[4],"blo
101c0 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  b10")==0 ){.    
101d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
101e0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
101f0 78 2c 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30  x, "abc\000xyz\0
10200 30 30 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54  00pq", 10, SQLIT
10210 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c  E_STATIC);.  }el
10220 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
10230 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10240 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73   "4th argument s
10250 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
10260 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20     "\"null\" or 
10270 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22  \"static\" or \"
10280 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20  normal\"", 0);. 
10290 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
102a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
102b0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
102c0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
102d0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
102e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
102f0 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  R;.  if( rc ){. 
10300 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d     char zBuf[50]
10310 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
10320 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
10330 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
10340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
10350 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Buf, sqlite3ErrS
10360 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
10370 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10380 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10390 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  CL_OK;.}..#ifnde
103a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
103b0 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  F16./*.** Usage:
103c0 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74   add_test_collat
103d0 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  e <db ptr> <utf8
103e0 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
103f0 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
10400 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
10410 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
10420 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
10430 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74  e correct collat
10440 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ion.** sequence 
10450 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75  callback when mu
10460 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20  ltiple versions 
10470 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74  (for different t
10480 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a  ext encodings).*
10490 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  * are available.
104a0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
104b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
104c0 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74  sters the collat
104d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65  ion sequence "te
104e0 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77  st_collate".** w
104f0 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
10500 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65  dle <db>. The se
10510 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75  cond argument mu
10520 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20  st be a list of 
10530 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  three.** boolean
10540 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20   values. If the 
10550 66 69 72 73 74 20 69 73 20 74 72 75 65 2c 20 74  first is true, t
10560 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  hen a version of
10570 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73   test_collate is
10580 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 66  .** registered f
10590 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65  or UTF-8, if the
105a0 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c   second is true,
105b0 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65   a version is re
105c0 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20  gistered for.** 
105d0 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65  UTF-16le, if the
105e0 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
105f0 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
10600 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
10610 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72  .** Previous ver
10620 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f  sions of test_co
10630 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74 65  llate are delete
10640 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  d..**.** The col
10650 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
10660 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20  test_collate is 
10670 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
10680 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f  alling the.** fo
10690 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69  llowing TCL scri
106a0 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73  pt:.**.**   "tes
106b0 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20  t_collate <enc> 
106c0 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a  <lhs> <rhs>".**.
106d0 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64  ** The <lhs> and
106e0 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20 74   <rhs> are the t
106f0 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  wo values being 
10700 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65  compared, encode
10710 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54  d in UTF-8..** T
10720 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74  he <enc> paramet
10730 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69  er is the encodi
10740 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  ng of the collat
10750 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  ion function tha
10760 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65  t.** SQLite sele
10770 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68  cted to call. Th
10780 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69 70  e TCL test scrip
10790 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
107a0 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  .** "test_collat
107b0 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e  e" proc..**.** N
107c0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 77 69  ote that this wi
107d0 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74  ll only work wit
107e0 68 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72  h one intepreter
107f0 20 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74   at a time, as t
10800 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69  he.** interp poi
10810 6e 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e  nter to use when
10820 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
10830 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74  TCL script is st
10840 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74  ored in.** pTest
10850 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a  CollateInterp..*
10860 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74  /.static Tcl_Int
10870 65 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74  erp* pTestCollat
10880 65 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20  eInterp;.static 
10890 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
108a0 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  _func(.  void *p
108b0 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20  Ctx, .  int nA, 
108c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
108d0 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20    int nB, const 
108e0 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63  void *zB.){.  Tc
108f0 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54  l_Interp *i = pT
10900 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
10910 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20  ;.  int encin = 
10920 28 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74  (int)pCtx;.  int
10930 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a   res;.  int n;..
10940 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10950 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pVal;.  Tcl_Obj
10960 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63   *pX;..  pX = Tc
10970 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10980 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d  test_collate", -
10990 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
109a0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73  fCount(pX);..  s
109b0 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a  witch( encin ){.
109c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
109d0 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f  UTF8:.      Tcl_
109e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
109f0 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
10a00 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
10a10 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  8",-1));.      b
10a20 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
10a30 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20  QLITE_UTF16LE:. 
10a40 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
10a50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
10a60 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
10a70 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d  Obj("UTF-16LE",-
10a80 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
10a90 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
10aa0 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20  E_UTF16BE:.     
10ab0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10ac0 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
10ad0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10ae0 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b  "UTF-16BE",-1));
10af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10b00 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
10b10 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
10b20 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
10b30 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
10b40 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
10b50 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 69 66  alueNew(0);.  if
10b60 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ( pVal ){.    sq
10b70 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
10b80 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65  (pVal, nA, zA, e
10b90 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  ncin, SQLITE_STA
10ba0 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71  TIC);.    n = sq
10bb0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
10bc0 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c  s(pVal);.    Tcl
10bd0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10be0 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20  ement(i,pX,.    
10bf0 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
10c00 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
10c10 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
10c20 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71  Val),n));.    sq
10c30 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
10c40 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65  (pVal, nB, zB, e
10c50 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  ncin, SQLITE_STA
10c60 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71  TIC);.    n = sq
10c70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
10c80 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c  s(pVal);.    Tcl
10c90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10ca0 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20  ement(i,pX,.    
10cb0 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
10cc0 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
10cd0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
10ce0 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71  Val),n));.    sq
10cf0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
10d00 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Val);.  }.  sqli
10d10 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
10d20 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61  oc();..  Tcl_Eva
10d30 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30 29  lObjEx(i, pX, 0)
10d40 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
10d50 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
10d60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c  GetIntFromObj(i,
10d70 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
10d80 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20 72  t(i), &res);.  r
10d90 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61  eturn res;.}.sta
10da0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
10db0 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  late(.  void * c
10dc0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10dd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10de0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10df0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10e00 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10e10 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
10e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
10e30 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
10e40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10e50 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
10e60 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74  s;.  pTestCollat
10e70 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  eInterp = interp
10e80 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
10e90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10ea0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10eb0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
10ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
10ed0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
10ee0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
10ef0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10f00 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
10f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10f20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
10f30 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
10f40 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
10f50 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
10f60 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
10f70 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76  *)SQLITE_UTF8, v
10f80 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
10f90 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72  func:0);.  if( r
10fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10fb0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
10fc0 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28 20  zUtf16;.    if( 
10fd0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
10fe0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
10ff0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
11000 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
11010 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20  L_ERROR;.    rc 
11020 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
11030 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
11040 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
11050 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
11060 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
11070 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
11080 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  LE, val?test_col
11090 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
110a0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
110b0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
110c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
110d0 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
110e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
110f0 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73 71  #if 0.    if( sq
11100 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
11110 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  l>0 ){.      sql
11120 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
11130 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
11140 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
11150 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11160 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  ex);.    pVal = 
11170 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
11180 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
11190 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
111a0 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  , -1, "test_coll
111b0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
111c0 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
111d0 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
111e0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
111f0 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
11200 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
11210 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11220 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
11230 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
11260 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
11270 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53 51  6(db, zUtf16, SQ
11280 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
11290 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
112a0 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c  )SQLITE_UTF16BE,
112b0 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
112c0 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 7d  e_func:0);.    }
112d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
112e0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
112f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11300 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11310 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
11320 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
11330 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
11340 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11350 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53  ;.  .  if( rc!=S
11360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11370 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11380 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
11390 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
113a0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
113b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
113c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
113d0 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
113e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
113f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11400 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11410 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
11420 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11430 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11440 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
11450 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
11460 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
11470 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
11480 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c  ** When the coll
11490 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c  ation needed cal
114a0 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
114b0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d  , record the nam
114c0 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71  e of .** the req
114d0 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67  uested collating
114e0 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
114f0 20 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61   The recorded na
11500 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20  me is linked.** 
11510 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c  to a TCL variabl
11520 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  e and used to ma
11530 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
11540 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
11550 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20  tion.** name is 
11560 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
11570 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43  ic char zNeededC
11580 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73  ollation[200];.s
11590 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65  tatic char *pzNe
115a0 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20  ededCollation = 
115b0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
115c0 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  ;.../*.** Called
115d0 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e   when a collatin
115e0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65  g sequence is ne
115f0 65 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65  eded.  Registere
11600 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
11610 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
11620 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74  ded16()..*/.stat
11630 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c  ic void test_col
11640 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a  late_needed_cb(.
11650 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
11660 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
11670 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
11680 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d  const void *pNam
11690 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d  e.){.  int enc =
116a0 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20   ENC(db);.  int 
116b0 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
116c0 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70  for(z = (char*)p
116d0 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c  Name, i=0; *z ||
116e0 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20   z[1]; z++){.   
116f0 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65   if( *z ) zNeede
11700 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20  dCollation[i++] 
11710 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65  = *z;.  }.  zNee
11720 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20  dedCollation[i] 
11730 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  = 0;.  sqlite3_c
11740 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
11750 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74  .      db, "test
11760 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64  _collate", ENC(d
11770 62 29 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c  b), (void *)enc,
11780 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
11790 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  nc);.}../*.** Us
117a0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
117b0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a  llate_needed DB.
117c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
117d0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
117e0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
117f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
11800 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
11810 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
11820 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
11830 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
11840 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
11850 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
11860 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
11870 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
11880 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11890 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
118a0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
118b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
118c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
118d0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20  on_needed16(db, 
118e0 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  0, test_collate_
118f0 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e  needed_cb);.  zN
11900 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30  eededCollation[0
11910 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  ] = 0;.  if( sql
11920 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11930 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
11940 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11950 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
11960 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
11970 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11980 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11990 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
119a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
119b0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
119c0 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f    add_alignment_
119d0 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20  test_collations 
119e0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77   DB.**.** Add tw
119f0 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  o new collating 
11a00 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65  sequences to the
11a10 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a   database DB.**.
11a20 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69  **     utf16_ali
11a30 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31  gned.**     utf1
11a40 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a  6_unaligned.**.*
11a50 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
11a60 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74   sequences use t
11a70 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
11a80 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a  er as BINARY..**
11a90 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
11aa0 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65  ence is that the
11ab0 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63   utf16_aligned c
11ac0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
11ad0 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64  ence is declared
11ae0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
11af0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66  _UTF16_ALIGNED f
11b00 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  lag..** Both col
11b10 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
11b20 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75   increment the u
11b30 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63  naligned utf16 c
11b40 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76  ounter.** whenev
11b50 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74  er they see a st
11b60 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
11b70 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20   on an odd byte 
11b80 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61  boundary..*/.sta
11b90 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65  tic int unaligne
11ba0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
11bb0 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
11bc0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
11bd0 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
11be0 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
11bf0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
11c00 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
11c10 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
11c20 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
11c30 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
11c40 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
11c50 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65  nKey2;.  if( nKe
11c60 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69  y1>0 && 1==(1&(i
11c70 6e 74 29 70 4b 65 79 31 29 20 29 20 75 6e 61 6c  nt)pKey1) ) unal
11c80 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
11c90 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b  nter++;.  if( nK
11ca0 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey2>0 && 1==(1&(
11cb0 69 6e 74 29 70 4b 65 79 32 29 20 29 20 75 6e 61  int)pKey2) ) una
11cc0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
11cd0 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20  unter++;.  rc = 
11ce0 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
11cf0 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
11d00 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
11d10 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
11d20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11d30 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  .}.static int ad
11d40 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
11d50 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76  _collations(.  v
11d60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
11d70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
11d80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
11d90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
11da0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11db0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11dc0 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20  if( objc>=2 ){. 
11dd0 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
11de0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11df0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11e00 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11e10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11e20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11e30 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
11e40 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c  tf16_unaligned",
11e50 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a   SQLITE_UTF16, .
11e60 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
11e70 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
11e80 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11e90 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
11ea0 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c  "utf16_aligned",
11eb0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
11ec0 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20  IGNED, .        
11ed0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
11ee0 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Func);.  }.  ret
11ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11f00 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11f10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11f20 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  UTF16) */../*.**
11f30 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
11f40 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
11f50 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
11f60 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
11f70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11f80 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
11f90 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
11fa0 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
11fb0 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
11fc0 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
11fd0 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
11fe0 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
11ff0 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
12000 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
12010 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
12020 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
12030 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
12040 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
12050 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
12060 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
12070 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
12080 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
12090 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
120a0 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
120b0 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
120c0 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
120d0 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
120e0 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
120f0 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
12100 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
12110 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
12120 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
12130 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
12140 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
12150 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
12160 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
12170 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
12180 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
12190 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
121a0 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
121b0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
121c0 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
121d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
121e0 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
121f0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
12200 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
12210 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
12220 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
12230 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
12240 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
12250 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
12260 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
12270 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
12280 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
12290 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
122a0 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
122b0 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
122c0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
122d0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
122e0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
122f0 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
12300 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
12310 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
12320 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
12330 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
12340 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
12350 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
12360 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
12370 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
12380 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e  TF-16BE..*/.#ifn
12390 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
123a0 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69  UTF16.static voi
123b0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
123c0 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
123d0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
123e0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
123f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
12400 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
12410 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
12420 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
12430 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12440 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
12450 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
12460 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
12470 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
12480 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
12490 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
124a0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
124b0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
124c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
124d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
124e0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
124f0 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
12500 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
12510 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12520 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
12530 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12540 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12550 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
12560 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
12570 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
12580 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
12590 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
125a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
125b0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63  lt_text(pCtx, Tc
125c0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
125d0 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53  t(interp), -1, S
125e0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
125f0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
12600 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
12610 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12620 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
12630 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
12640 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
12650 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
12660 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12670 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
12680 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73  text16be(pCtx, s
12690 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
126a0 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16be(pVal),.   
126b0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
126c0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
126d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
126e0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
126f0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
12700 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74  utf16le(.  sqlit
12710 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
12720 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
12730 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12740 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
12750 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
12760 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
12770 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
12780 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
12790 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
127a0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
127b0 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
127c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
127d0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
127e0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
127f0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
12800 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12810 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12820 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
12830 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
12840 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
12850 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12860 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
12870 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
12880 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
12890 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
128a0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
128b0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
128c0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
128d0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
128e0 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
128f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
12900 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
12910 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
12920 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
12930 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
12940 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
12950 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
12960 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
12970 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
12980 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12990 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
129a0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
129b0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
129c0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
129d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
129e0 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
129f0 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6be(.  sqlite3_c
12a00 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
12a10 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
12a20 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
12a30 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
12a40 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
12a50 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
12a60 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
12a70 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
12a80 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
12a90 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
12aa0 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
12ab0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
12ac0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
12ad0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
12ae0 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
12af0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12b00 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
12b10 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12b20 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29  ("UTF-16BE", -1)
12b30 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
12b40 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12b50 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
12b60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12b70 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
12b80 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
12b90 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
12ba0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
12bb0 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
12bc0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
12bd0 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
12be0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
12bf0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
12c00 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
12c10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
12c20 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
12c30 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
12c40 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12c50 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
12c60 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73  t_text16(pCtx, s
12c70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12c80 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
12c90 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
12ca0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
12cb0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
12cc0 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  6be(pCtx, sqlite
12cd0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65  3_value_text16le
12ce0 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
12cf0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
12d00 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  NT);.  sqlite3_r
12d10 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70  esult_text16le(p
12d20 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
12d30 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
12d40 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
12d50 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
12d60 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12d70 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64  ee(pVal);.}.#end
12d80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12d90 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69  T_UTF16 */.stati
12da0 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74  c int test_funct
12db0 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
12dc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12dd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12de0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12df0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12e00 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
12e10 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12e20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
12e30 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66    int val;..  if
12e40 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
12e50 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
12e60 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12e70 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12e80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12e90 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12ea0 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
12eb0 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
12ec0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12ed0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
12ee0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
12ef0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
12f00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12f10 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
12f20 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
12f30 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
12f40 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  TF8, .        in
12f50 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
12f60 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b  ion_utf8, 0, 0);
12f70 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
12f80 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
12f90 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
12fa0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
12fb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12fc0 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
12fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12fe0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
12ff0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
13000 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
13010 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6LE, .        in
13020 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
13030 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20  ion_utf16le, 0, 
13040 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43  0);.  }.  if( TC
13050 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
13060 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
13070 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
13080 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
13090 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
130a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
130b0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
130c0 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
130d0 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
130e0 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
130f0 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
13100 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20  nction_utf16be, 
13110 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
13120 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64  turn TCL_OK;.bad
13130 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
13140 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13150 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13160 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
13170 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
13180 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
13190 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
131a0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
131b0 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
131c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
131d0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
131e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
131f0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
13200 65 3a 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  e:         test_
13210 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
13220 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
13230 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
13240 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
13250 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
13260 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
13270 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
13280 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
13290 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
132a0 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
132b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
132c0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
132d0 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
132e0 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
132f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
13300 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
13310 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
13320 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
13330 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
13340 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
13350 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  rstr(.  void * c
13360 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13370 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13380 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
13390 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
133a0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
133b0 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  zCode;.  int i;.
133c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
133d0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
133e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
133f0 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63   objv, "<error c
13400 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a  ode>");.  }..  z
13410 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Code = Tcl_GetSt
13420 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
13430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b   for(i=0; i<200;
13440 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
13450 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72  ==strcmp(t1Error
13460 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
13470 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
13480 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
13490 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
134a0 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
134b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
134c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
134d0 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
134e0 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
134f0 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
13500 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
13510 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
13520 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
13530 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
13540 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
13550 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
13560 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
13570 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
13580 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
13590 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
135a0 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
135b0 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
135c0 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
135d0 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
135e0 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
135f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
13600 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
13610 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
13620 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
13630 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
13640 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
13650 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
13660 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
13670 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
13680 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
13690 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
136a0 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
136b0 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
136c0 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
136d0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
136e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
136f0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
13700 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
13710 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
13720 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
13730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13740 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
13750 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
13760 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
13770 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
13780 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
13790 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
137a0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
137b0 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
137c0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
137d0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
137e0 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
137f0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
13800 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
13810 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
13820 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
13830 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
13840 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
13850 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
13860 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13870 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
13880 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
13890 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
138a0 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
138b0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
138c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
138d0 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
138e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
138f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13900 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13910 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13920 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13930 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13940 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
13950 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
13960 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
13970 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
13980 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13990 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
139a0 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
139b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
139c0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
139d0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
139e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
139f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
13a00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13a10 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
13a20 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13a30 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
13a40 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
13a50 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
13a60 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13a70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
13a80 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
13a90 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
13aa0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
13ab0 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
13ac0 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
13ad0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13ae0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
13af0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
13b00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13b10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
13b30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13b40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
13b50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13b60 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
13b70 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20  ind_int  STMT N 
13b80 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
13b90 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
13ba0 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e  d_int interface.
13bb0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
13bc0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
13bd0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
13be0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
13bf0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
13c00 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
13c10 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
13c20 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  s a 32-bit integ
13c30 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
13c40 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
13c50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
13c60 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  nd_int(.  void *
13c70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
13c80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13c90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13ca0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
13cb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13cc0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13cd0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
13ce0 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
13cf0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
13d00 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
13d10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13d20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13d30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
13d40 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
13d50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13d60 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
13d70 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
13d80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13d90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
13da0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
13db0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
13dc0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
13dd0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
13de0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
13df0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
13e00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13e10 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
13e20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13e30 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
13e40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13e50 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
13e60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13e70 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
13e80 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
13e90 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
13ea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13eb0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13ec0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
13ed0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13f00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13f10 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
13f20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13f30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
13f40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
13f50 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
13f60 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
13f70 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
13f80 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
13f90 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
13fa0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
13fb0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
13fc0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
13fd0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13fe0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
13ff0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
14000 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
14010 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
14020 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
14030 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
14040 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
14050 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14060 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14070 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14080 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14090 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
140a0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
140b0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34    int idx;.  i64
140c0 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
140d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
140e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
140f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14100 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
14110 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
14120 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
14130 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14140 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
14150 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
14160 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14170 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
14180 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
14190 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
141a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
141b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
141c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
141d0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
141e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
141f0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
14200 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
14210 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
14220 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14230 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
14240 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14250 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
14260 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
14270 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
14280 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
14290 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
142a0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
142b0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
142c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
142d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
142e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
142f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
14300 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14310 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
14320 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
14330 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e  d_double  STMT N
14340 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
14350 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
14360 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66  nd_double interf
14370 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
14380 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
14390 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
143a0 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
143b0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
143c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
143d0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
143e0 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69  binds a 64-bit i
143f0 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
14400 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
14410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14420 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20  t_bind_double(. 
14430 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14440 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14450 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14460 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14470 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14480 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14490 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
144a0 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  x;.  double valu
144b0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  e;.  int rc;.  c
144c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b  onst char *zVal;
144d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
144e0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
144f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14500 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
14510 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63  Name of the spec
14520 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ial floating poi
14530 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
14540 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70  unsigned int iUp
14550 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20  per;   /* Upper 
14560 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75  32 bits */.    u
14570 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77  nsigned int iLow
14580 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33  er;   /* Lower 3
14590 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53  2 bits */.  } aS
145a0 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20  pecialFp[] = {. 
145b0 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20     {  "NaN",    
145c0 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78    0x7fffffff, 0x
145d0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
145e0 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30  {  "SNaN",     0
145f0 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  x7ff7ffff, 0xfff
14600 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
14610 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66  "-NaN",     0xff
14620 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
14630 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53  ff },.    {  "-S
14640 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66  NaN",    0xfff7f
14650 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
14660 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22  },.    {  "+Inf"
14670 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30  ,     0x7ff00000
14680 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
14690 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20      {  "-Inf",  
146a0 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30     0xfff00000, 0
146b0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
146c0 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20   {  "Epsilon",  
146d0 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x00000000, 0x00
146e0 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
146f0 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38   "-Epsilon", 0x8
14700 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  0000000, 0x00000
14710 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e  001 },.    {  "N
14720 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38  aN0",     0x7ff8
14730 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
14740 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
14750 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30  0",    0xfff8000
14760 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
14770 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
14780 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
14790 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
147a0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
147b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
147c0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
147d0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
147e0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
147f0 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
14800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
14810 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
14820 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
14830 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
14840 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
14850 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
14860 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14870 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
14880 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14890 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
148a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
148b0 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74  ..  /* Intercept
148c0 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e   the string "NaN
148d0 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  " and generate a
148e0 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69   NaN value for i
148f0 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65  t..  ** All othe
14900 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61  r strings are pa
14910 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
14920 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
14930 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c  mObj()..  ** Tcl
14940 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
14950 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72  j() should under
14960 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20  stand "NaN" but 
14970 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20  some versions.  
14980 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  ** contain a bug
14990 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20  ..  */.  zVal = 
149a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
149b0 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[3]);.  for(i=
149c0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65  0; i<sizeof(aSpe
149d0 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
149e0 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69  SpecialFp[0]); i
149f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
14a00 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69  cmp(aSpecialFp[i
14a10 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d  ].zName, zVal)==
14a20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14a30 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20  e3_uint64 x;.   
14a40 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46     x = aSpecialF
14a50 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20  p[i].iUpper;.   
14a60 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20     x <<= 32;.   
14a70 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c     x |= aSpecial
14a80 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20  Fp[i].iLower;.  
14a90 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14aa0 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a  of(value)==8 );.
14ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
14ac0 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20  zeof(x)==8 );.  
14ad0 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75      memcpy(&valu
14ae0 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20  e, &x, 8);.     
14af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14b00 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
14b10 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
14b20 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
14b30 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  0]) &&.         
14b40 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
14b50 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14b60 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b  v[3], &value) ){
14b70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14b80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
14b90 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
14ba0 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
14bb0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
14bc0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
14bd0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
14be0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
14bf0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14c00 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
14c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14c20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14c30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
14c40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
14c50 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
14c60 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
14c70 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
14c80 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
14c90 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
14ca0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
14cb0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
14cc0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
14cd0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
14ce0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
14cf0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
14d00 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
14d10 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
14d20 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
14d30 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
14d40 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
14d50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14d60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14d70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14d80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14d90 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
14da0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
14db0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
14dc0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
14dd0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
14de0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14df0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
14e00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
14e10 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
14e20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
14e30 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
14e40 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
14e50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14e60 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
14e70 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
14e80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14e90 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
14ea0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14eb0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
14ec0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
14ed0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
14ee0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
14ef0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
14f00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
14f10 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
14f20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
14f30 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
14f40 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
14f50 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
14f60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14f70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14f80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14f90 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
14fa0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14fb0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
14fc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
14fd0 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
14fe0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
14ff0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
15000 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
15010 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
15020 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15030 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
15040 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
15050 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
15060 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
15070 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
15080 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
15090 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
150a0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
150b0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
150c0 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
150d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
150e0 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
150f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15100 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15110 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15120 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15130 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15140 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15150 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
15160 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
15170 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
15180 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
15190 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
151a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
151b0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
151c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
151d0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
151e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
151f0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
15200 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
15210 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
15220 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15230 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15240 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15250 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15260 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
15270 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15280 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15290 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
152a0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
152b0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
152c0 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
152d0 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
152e0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
152f0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
15300 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15310 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15320 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
15330 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
15340 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15350 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
15360 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
15370 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54  ue, bytes, SQLIT
15380 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
15390 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
153a0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
153b0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
153c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
153d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
153e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
153f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15400 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
15410 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
15420 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
15430 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15440 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15450 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
15460 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
15470 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74  bind_text16 ?-st
15480 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52  atic? STMT N STR
15490 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ING BYTES.**.** 
154a0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
154b0 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74  _bind_text16 int
154c0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
154d0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
154e0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
154f0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
15500 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
15510 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15520 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
15530 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31  ** binds a UTF-1
15540 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20  6 string STRING 
15550 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
15560 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20    The string is 
15570 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c  BYTES bytes.** l
15580 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
15590 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  nt test_bind_tex
155a0 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t16(.  void * cl
155b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
155c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
155d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
155e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
155f0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
15600 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15610 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
15620 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
15630 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
15640 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
15650 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64   int rc;..  void
15660 20 28 2a 78 44 65 6c 29 28 29 20 3d 20 28 6f 62   (*xDel)() = (ob
15670 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41  jc==6?SQLITE_STA
15680 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53  TIC:SQLITE_TRANS
15690 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  IENT);.  Tcl_Obj
156a0 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a   *oStmt    = obj
156b0 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c  v[objc-4];.  Tcl
156c0 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d  _Obj *oN       =
156d0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20   objv[objc-3];. 
156e0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e   Tcl_Obj *oStrin
156f0 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  g  = objv[objc-2
15700 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42  ];.  Tcl_Obj *oB
15710 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  ytes   = objv[ob
15720 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  jc-1];..  if( ob
15730 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
15740 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
15750 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15760 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
15770 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
15780 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
15790 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
157a0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
157b0 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
157c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
157d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
157e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
157f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15800 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c  etString(oStmt),
15810 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
15820 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15830 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15840 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c  mObj(interp, oN,
15850 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
15860 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
15870 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
15880 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
15890 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b  Obj(oString, 0);
158a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
158b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
158c0 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29   oBytes, &bytes)
158d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
158e0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
158f0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
15900 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
15910 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
15920 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20  s, xDel);.  if( 
15930 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
15940 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
15950 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
15960 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15970 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
15980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
15990 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
159a0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54  interp, sqlite3T
159b0 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
159c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
159d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
159e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
159f0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
15a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
15a20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15a30 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53  blob ?-static? S
15a40 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
15a50 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
15a60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
15a70 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  b interface.  ST
15a80 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15a90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15aa0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15ab0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15ac0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15ad0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
15ae0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
15af0 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64  BLOB to the wild
15b00 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20  card.  The BLOB 
15b10 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69  is BYTES bytes i
15b20 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
15b30 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
15b40 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
15b50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15b60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15b70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15b80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15b90 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15ba0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
15bb0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
15bc0 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
15bd0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
15be0 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75    sqlite3_destru
15bf0 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72  ctor_type xDestr
15c00 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54  uctor = SQLITE_T
15c10 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28  RANSIENT;..  if(
15c20 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
15c30 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=6 ){.    Tcl_A
15c40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15c50 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
15c60 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
15c70 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
15c80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
15c90 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
15ca0 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 22  MT N DATA BYTES"
15cb0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15cc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15cd0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29  .  if( objc==6 )
15ce0 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74 6f  {.    xDestructo
15cf0 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49  r = SQLITE_STATI
15d00 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20  C;.    objv++;. 
15d10 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15d20 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15d30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15d40 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15d50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15d60 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15d70 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15d80 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15d90 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15da0 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
15db0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
15dc0 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  objv[3]);.  if( 
15dd0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15de0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
15df0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
15e00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
15e20 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
15e30 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
15e40 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29 3b  s, xDestructor);
15e50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
15e60 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
15e70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
15e80 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
15e90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15eb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
15ec0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
15ed0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15ee0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15ef0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
15f00 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54  ameter_count  ST
15f10 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
15f20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69  the number of wi
15f30 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20 67  ldcards in the g
15f40 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a  iven statement..
15f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15f60 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
15f70 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  r_count(.  void 
15f80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
15f90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15fa0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15fb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
15fc0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
15fd0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
15fe0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
15ff0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
16000 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16010 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
16020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16030 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
16040 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16050 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16060 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16070 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16080 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16090 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
160a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
160b0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  IntObj(sqlite3_b
160c0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
160d0 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  unt(pStmt)));.  
160e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
160f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
16100 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
16110 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54  rameter_name  ST
16120 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  MT  N.**.** Retu
16130 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
16140 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e  he Nth wildcard.
16150 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c 64    The first wild
16160 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e  card is 1..** An
16170 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73   empty string is
16180 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69   returned if N i
16190 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f  s out of range o
161a0 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  r if the wildcar
161b0 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73  d.** is nameless
161c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
161d0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
161e0 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64  ter_name(.  void
161f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16200 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16210 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16220 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16230 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16240 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16250 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  t;.  int i;..  i
16260 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
16270 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16280 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
16290 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20  jv, "STMT N");. 
162a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
162b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
162c0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
162d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
162e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
162f0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16300 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16310 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16320 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
16330 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e 20  ], &i) ) return 
16340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
16350 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16360 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
16370 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
16380 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
16390 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ter_name(pStmt,i
163a0 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74  ),-1).  );.  ret
163b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
163c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
163d0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
163e0 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54  eter_index  STMT
163f0 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74    NAME.**.** Ret
16400 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
16410 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 61   the wildcard ca
16420 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75  lled NAME.  Retu
16430 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73  rn 0 if there is
16440 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64  .** no such wild
16450 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
16460 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
16470 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20  rameter_index(. 
16480 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16490 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
164a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
164b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
164c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
164d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
164e0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
164f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
16500 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16510 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
16520 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20  "STMT NAME");.  
16530 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16540 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
16550 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
16560 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16570 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
16580 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
16590 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
165a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
165b0 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
165c0 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20  wIntObj(.       
165d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
165e0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74  ameter_index(pSt
165f0 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mt,Tcl_GetString
16600 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20  (objv[2])).     
16610 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ).  );.  return 
16620 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16630 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16640 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
16650 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74   STMT.**.*/.stat
16660 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61  ic int test_clea
16670 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f  r_bindings(.  vo
16680 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
16690 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
166a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
166b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
166c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
166d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
166e0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
166f0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
16700 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16710 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
16720 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
16730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16740 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16750 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16760 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16770 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16790 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
167a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
167b0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
167c0 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
167d0 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
167e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
167f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16800 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c  lite3_sleep MILL
16810 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74  ISECONDS.*/.stat
16820 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65 65  ic int test_slee
16830 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
16840 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
16850 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16860 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16870 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16880 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a  ].){.  int ms;..
16890 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
168a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
168b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
168c0 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
168d0 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75  ONDS");.    retu
168e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
168f0 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
16900 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16910 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20  , objv[1], &ms) 
16920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
16930 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
16940 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
16950 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
16960 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c  ntObj(sqlite3_sl
16970 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74  eep(ms)));.  ret
16980 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16990 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
169a0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
169b0 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
169c0 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
169d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
169e0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
169f0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
16a00 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
16a10 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
16a20 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
16a30 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64  t test_ex_errcod
16a40 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
16a50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
16a60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16a70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16a80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16a90 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
16aa0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
16ab0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
16ac0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16ad0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16ae0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16af0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
16b00 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16b10 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
16b20 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16b40 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
16b50 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16b60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16b70 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
16b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
16b90 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e   = sqlite3_exten
16ba0 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  ded_errcode(db);
16bb0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
16bc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
16bd0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
16be0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
16bf0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
16c00 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
16c10 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a  e3_errcode DB.**
16c20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
16c30 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
16c40 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
16c50 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
16c60 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63  * API.** error c
16c70 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54  ode. e.g. "SQLIT
16c80 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61  E_ERROR"..*/.sta
16c90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
16ca0 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  code(.  void * c
16cb0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16cc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16cd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16ce0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16cf0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
16d00 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
16d10 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
16d20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16d30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16d40 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16d50 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
16d60 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16d70 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
16d80 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
16d90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16da0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
16db0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16dc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16dd0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
16de0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
16e00 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
16e10 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16e20 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
16e30 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
16e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
16e50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
16e60 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65 72  ge:   sqlite3_er
16e70 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  rmsg DB.**.** Re
16e80 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20  turns the UTF-8 
16e90 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
16ea0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
16eb0 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
16ec0 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
16ed0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
16ee0 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
16ef0 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28  int test_errmsg(
16f00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16f10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16f20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
16f30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16f40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16f50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16f60 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16f70 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zErr;..  if( obj
16f80 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
16f90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16fa0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16fb0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16fc0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
16fd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
16fe0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
16ff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17000 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
17010 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
17020 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17030 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
17040 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17050 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
17060 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
17070 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17080 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17090 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
170a0 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  rr, -1));.  retu
170b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
170c0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73  .** Usage:   tes
170d0 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a  t_errmsg16 DB.**
170e0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
170f0 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74  UTF-16 represent
17100 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
17110 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
17120 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
17130 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
17140 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69  _* API call. Thi
17150 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72 61  s is a byte arra
17160 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  y object at the 
17170 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61  TCL .** level, a
17180 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  nd it includes t
17190 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65 72  he 0x00 0x00 ter
171a0 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74  minator bytes at
171b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
171c0 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  ** UTF-16 string
171d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
171e0 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20  test_errmsg16(. 
171f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17200 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17210 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17220 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17230 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17250 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
17260 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
17270 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20  t void *zErr;.  
17280 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
17290 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a   int bytes = 0;.
172a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
172b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
172c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
172d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
172e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
172f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17300 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
17310 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
17320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17330 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
17340 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17350 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17360 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
17370 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
17380 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
17390 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20  errmsg16(db);.  
173a0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
173b0 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66 6f  z = zErr;.    fo
173c0 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79 74  r(bytes=0; z[byt
173d0 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b 31  es] || z[bytes+1
173e0 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a 20  ]; bytes+=2){}. 
173f0 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
17400 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
17410 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
17420 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b  j(zErr, bytes));
17430 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17440 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
17450 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17470 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
17480 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
17490 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
174a0 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
174b0 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
174c0 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
174d0 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
174e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
174f0 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
17500 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
17510 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
17520 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
17530 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
17540 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
17550 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
17560 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
17570 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
17580 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
17590 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
175a0 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  are(.  void * cl
175b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
175c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
175d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
175e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
175f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17600 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
17610 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
17620 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
17630 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
17640 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17650 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
17660 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
17670 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
17680 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
17690 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
176a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
176b0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
176c0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
176d0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
176e0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
176f0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
17700 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
17710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17720 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17730 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
17740 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17750 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
17760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17770 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
17780 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
17790 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
177a0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
177b0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
177c0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
177d0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
177e0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
177f0 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
17800 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
17810 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
17820 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
17830 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
17840 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17850 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
17860 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
17870 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a  L_ERROR;.  if( z
17880 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20  Tail && objc>=5 
17890 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73  ){.    if( bytes
178a0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74  >=0 ){.      byt
178b0 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54  es = bytes - (zT
178c0 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
178d0 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28  .    if( strlen(
178e0 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a  zTail)<bytes ){.
178f0 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 73 74        bytes = st
17900 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20  rlen(zTail);.   
17910 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
17920 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
17930 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
17940 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
17950 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
17960 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
17970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
17980 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
17990 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
179a0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
179b0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
179c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
179d0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
179e0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
179f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17a00 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
17a10 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
17a20 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
17a30 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
17a40 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
17a50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17a60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17a70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
17a80 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
17a90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17aa0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17ab0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
17ac0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
17ad0 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
17ae0 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
17af0 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
17b00 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
17b10 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
17b20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17b30 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
17b40 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
17b50 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17b60 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
17b70 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
17b80 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
17b90 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
17ba0 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
17bb0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
17bc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
17bd0 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
17be0 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
17bf0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
17c00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17c10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17c20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17c30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17c40 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
17c50 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
17c60 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
17c70 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
17c80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17c90 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
17ca0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
17cb0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
17cc0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
17cd0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
17ce0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17cf0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
17d00 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
17d10 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
17d20 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
17d30 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
17d40 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
17d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17d60 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17d70 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
17d80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17d90 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
17da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17db0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
17dc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
17dd0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
17de0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17df0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
17e00 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17e10 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17e20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
17e30 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
17e40 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
17e50 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
17e60 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d  0);.  assert(rc=
17e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
17e80 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52  tmt==0);.  Tcl_R
17e90 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
17ea0 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
17eb0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
17ec0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
17ed0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17ee0 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20  .  if( zTail && 
17ef0 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
17f00 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
17f10 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
17f20 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c  es - (zTail-zSql
17f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
17f40 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
17f50 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
17f60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
17f70 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20  (zTail, bytes), 
17f80 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
17f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fa0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
17fb0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e  ==0 );.    sprin
17fc0 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
17fd0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
17fe0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17ff0 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
18000 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
18010 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18020 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
18030 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
18040 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
18050 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
18060 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
18070 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
18080 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
18090 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
180a0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
180b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
180c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
180d0 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
180e0 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a  re_tkt3134 DB.**
180f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70  .** Generate a p
18100 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18110 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74  t for a zero-byt
18120 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 74 65  e string as a te
18130 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74  st.** for ticket
18140 20 23 33 31 33 34 2e 20 20 54 68 65 20 73 74 72   #3134.  The str
18150 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72  ing should be pr
18160 65 63 65 65 64 65 64 20 62 79 20 61 20 7a 65 72  eceeded by a zer
18170 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o byte..*/.stati
18180 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
18190 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f  re_tkt3134(.  vo
181a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
181b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
181c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
181d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
181e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
181f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
18200 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
18210 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53   zSql[] = "\000S
18220 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69  ELECT 1";.  sqli
18230 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
18240 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
18250 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
18260 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18270 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18290 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
182a0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
182b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
182c0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
182d0 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
182e0 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
182f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18300 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18310 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18320 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18330 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18340 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
18360 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a  repare_v2(db, &z
18370 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d  Sql[1], 0, &pStm
18380 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
18390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
183a0 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66   pStmt==0);.  if
183b0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
183c0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
183d0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
183e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
183f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18400 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
18410 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69  t==0 );.    spri
18420 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
18430 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
18440 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18450 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
18460 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
18470 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18480 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18490 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
184a0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
184b0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
184c0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
184d0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
184e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
184f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18500 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
18510 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
18520 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18530 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
18540 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74  are16 DB sql byt
18550 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a  es tailvar.**.**
18560 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
18570 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
18580 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
18590 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
185a0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
185b0 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
185c0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
185d0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
185e0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
185f0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
18600 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
18610 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
18620 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
18630 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
18640 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18650 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
18660 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64  repare16(.  void
18670 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18680 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18690 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
186a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
186b0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
186c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
186d0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
186e0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
186f0 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74  d *zSql;.  const
18700 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30   void *zTail = 0
18710 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61  ;.  Tcl_Obj *pTa
18720 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
18730 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18740 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
18750 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20  0]; .  int rc;. 
18760 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20   int bytes;     
18770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18780 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66  e integer specif
18790 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a  ied as arg 3 */.
187a0 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20    int objlen;   
187b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
187c0 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65  he byte-array le
187d0 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f  ngth of arg 2 */
187e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
187f0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
18800 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18810 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18820 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18830 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18840 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18850 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
18860 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
18870 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
18880 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18890 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
188a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
188b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
188c0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
188d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
188e0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
188f0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
18900 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
18910 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18920 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18930 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
18940 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
18950 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
18960 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
18970 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
18980 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
18990 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
189a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
189b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
189c0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
189d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
189e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
189f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18a00 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
18a10 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
18a20 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
18a30 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
18a40 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
18a50 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
18a60 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
18a70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18a80 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
18a90 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
18aa0 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
18ab0 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
18ac0 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
18ad0 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
18ae0 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
18af0 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
18b00 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
18b10 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
18b20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
18b30 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
18b40 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
18b50 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
18b60 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
18b70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18b80 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
18b90 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
18ba0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
18bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18bc0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
18bd0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18be0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
18bf0 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71  epare16_v2 DB sq
18c00 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
18c10 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
18c20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
18c30 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
18c40 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
18c50 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
18c60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
18c70 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
18c80 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
18c90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
18ca0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
18cb0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
18cc0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
18cd0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
18ce0 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
18cf0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
18d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18d10 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
18d20 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
18d30 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18d40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18d50 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18d60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18d70 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
18d80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
18d90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18da0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
18db0 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
18dc0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
18dd0 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
18de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
18df0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
18e00 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
18e10 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
18e20 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
18e30 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
18e40 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
18e50 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
18e60 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
18e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
18e80 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
18e90 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
18ea0 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
18eb0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
18ec0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18ed0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18ee0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18ef0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18f00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18f10 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
18f20 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
18f30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18f40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18f50 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18f60 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18f70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18f80 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
18f90 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
18fa0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
18fb0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
18fc0 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
18fd0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18fe0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18ff0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
19000 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19010 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
19020 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62  _prepare16_v2(db
19030 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
19040 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
19050 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
19060 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
19070 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
19080 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
19090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
190a0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
190b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
190c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20  ..  if( objc>=5 
190d0 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c  ){.    if( zTail
190e0 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e   ){.      objlen
190f0 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38   = objlen - ((u8
19100 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
19110 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
19120 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
19130 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
19140 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
19150 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
19160 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
19170 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
19180 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
19190 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
191a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
191b0 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
191c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
191d0 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
191e0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
191f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
19200 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
19210 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
19220 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19230 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19240 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19250 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
19260 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19270 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
19280 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
19290 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
192a0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
192b0 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
192c0 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
192d0 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
192e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
192f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19300 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19310 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19320 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19330 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
19340 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
19350 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
19360 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
19370 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
19380 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
19390 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
193a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
193b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
193c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
193d0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
193e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
193f0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
19400 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
19410 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
19420 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19430 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
19440 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65   objc>1 ? Tcl_Ge
19450 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19460 20 3a 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   : 0;.  rc = sql
19470 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
19480 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
19490 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
194a0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
194b0 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
194c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
194d0 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
194e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
194f0 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
19500 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19510 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19520 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
19530 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
19540 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
19550 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  n16(.  void * cl
19560 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19570 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19580 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19590 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
195a0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
195b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
195c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
195d0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
195e0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
195f0 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
19600 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
19610 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
19620 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19630 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19640 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19650 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19660 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19670 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
19680 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
19690 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
196a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
196b0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
196c0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
196d0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
196e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
196f0 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  n16(zFilename, &
19700 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
19710 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
19720 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
19730 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
19740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19750 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19760 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
19770 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19780 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
19790 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
197a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
197b0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  e: sqlite3_compl
197c0 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74  ete16 <UTF-16 st
197d0 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ring>.**.** Retu
197e0 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70  rn 1 if the supp
197f0 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73  lied argument is
19800 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
19810 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65  statement, or ze
19820 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
19830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19840 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a  est_complete16(.
19850 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19860 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19870 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19880 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19890 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
198a0 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
198b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
198c0 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ETE) && !defined
198d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
198e0 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  16).  char *zBuf
198f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
19900 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
19910 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
19920 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d   1, objv, "<utf-
19930 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72  16 sql>");.    r
19940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19950 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28  .  }..  zBuf = (
19960 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
19970 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
19980 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c  jv[1], 0);.  Tcl
19990 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
199a0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
199b0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70  Obj(sqlite3_comp
199c0 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a  lete16(zBuf)));.
199d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
199e0 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26  _OMIT_COMPLETE &
199f0 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  & SQLITE_OMIT_UT
19a00 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
19a10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19a20 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19a30 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  step STMT.**.** 
19a40 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74  Advance the stat
19a50 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ement to the nex
19a60 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
19a70 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a   int test_step(.
19a80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19a90 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19aa0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19ab0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19ac0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19ad0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
19ae0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
19af0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
19b00 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
19b10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19b20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19b30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19b40 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19b50 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19b60 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
19b70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19b80 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
19b90 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19ba0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19bb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
19bc0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19bd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
19be0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
19bf0 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72  mt);..  /* if( r
19c00 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c!=SQLITE_DONE &
19c10 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
19c20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19c30 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65  ROR; */.  Tcl_Se
19c40 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
19c50 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
19c60 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
19c70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19c80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19c90 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  _sql(.  void * c
19ca0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19cb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19cc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19cd0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19ce0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
19cf0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
19d00 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
19d10 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
19d20 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
19d30 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
19d40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19d50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19d60 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
19d70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19d80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19d90 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19da0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
19db0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19dc0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
19dd0 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20  te3_sql(pStmt), 
19de0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
19df0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19e00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19e10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
19e20 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
19e30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19e40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
19e50 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
19e60 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
19e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19e80 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
19e90 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
19ea0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19eb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19ec0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19ed0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19ee0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
19ef0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
19f00 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
19f10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19f20 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19f30 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19f40 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19f50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19f60 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
19f70 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
19f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19f90 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
19fa0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19fb0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19fc0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
19fd0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19fe0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
19ff0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1a000 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1a010 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
1a020 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  n_count(pStmt)))
1a030 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1a040 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a050 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1a060 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  n_type STMT colu
1a070 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1a080 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
1a090 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
1a0a0 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
1a0b0 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
1a0c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1a0d0 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f  olumn_type(.  vo
1a0e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a0f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a100 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a110 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a120 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a130 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a140 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1a150 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28    int tp;..  if(
1a160 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1a170 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a180 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a190 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a1a0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a1b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a1c0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1a1d0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1a1e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a1f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1a200 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1a210 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1a220 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1a230 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a240 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1a250 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a260 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1a270 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1a280 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20  CL_ERROR;..  tp 
1a290 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1a2a0 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c  _type(pStmt, col
1a2b0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20  );.  switch( tp 
1a2c0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1a2d0 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20  TE_INTEGER: .   
1a2e0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1a2f0 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45  (interp, "INTEGE
1a300 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  R", TCL_STATIC);
1a310 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1a320 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
1a330 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ULL:.      Tcl_S
1a340 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1a350 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41   "NULL", TCL_STA
1a360 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1a370 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1a380 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
1a390 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1a3a0 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20  nterp, "FLOAT", 
1a3b0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1a3c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a3d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
1a3e0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1a3f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45  sult(interp, "TE
1a400 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  XT", TCL_STATIC)
1a410 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1a420 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a430 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f  BLOB:.      Tcl_
1a440 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1a450 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54  , "BLOB", TCL_ST
1a460 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1a470 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1a480 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
1a490 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1a4a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a4b0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a4c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54  _column_int64 ST
1a4d0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1a4e0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
1a4f0 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1a500 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1a510 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e  t row cast as an
1a520 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74  .** wide (64-bit
1a530 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  ) integer..*/.st
1a540 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1a550 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f  lumn_int64(.  vo
1a560 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a570 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a580 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a590 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a5a0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a5b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a5c0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1a5d0 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69    i64 iVal;..  i
1a5e0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1a5f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a600 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a610 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a620 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1a630 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a640 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1a650 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1a660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a670 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1a680 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1a690 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1a6a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1a6b0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a6c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1a6d0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1a6e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1a6f0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1a700 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
1a710 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
1a720 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1a730 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1a740 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1a750 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
1a760 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72  tObj(iVal));.  r
1a770 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a780 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1a790 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1a7a0 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  b STMT column.*/
1a7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1a7c0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
1a7d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a7e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a7f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a800 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a810 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a820 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a830 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1a840 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
1a850 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
1a860 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
1a870 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1a880 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a890 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a8a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a8b0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1a8c0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1a8d0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1a8e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a8f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a900 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1a910 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1a920 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1a930 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1a940 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a950 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a960 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a970 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1a980 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a990 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  R;..  len = sqli
1a9a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1a9b0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1a9c0 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
1a9d0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
1a9e0 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1a9f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1aa00 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
1aa10 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
1aa20 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
1aa30 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1aa40 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1aa50 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
1aa60 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1aa70 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1aa80 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1aa90 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1aaa0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
1aab0 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
1aac0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1aad0 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
1aae0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1aaf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ab00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ab10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ab20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1ab30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ab40 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64  ;.  int col;.  d
1ab50 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69  ouble rVal;..  i
1ab60 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1ab70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ab80 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ab90 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1aba0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1abb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1abc0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1abd0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1abe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1abf0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1ac00 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1ac10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1ac20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1ac30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1ac40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1ac50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1ac60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1ac70 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1ac80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1ac90 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
1aca0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
1acb0 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1acc0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1acd0 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  rp, Tcl_NewDoubl
1ace0 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72  eObj(rVal));.  r
1acf0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ad00 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ad10 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
1ad20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
1ad30 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ad40 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
1ad50 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
1ad60 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
1ad70 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ad80 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76  _data_count(.  v
1ad90 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ada0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1adb0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1adc0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1add0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ade0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1adf0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1ae00 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1ae10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ae20 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ae30 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ae40 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1ae50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1ae60 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1ae70 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ae80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ae90 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1aea0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1aeb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1aec0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1aed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1aee0 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1aef0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1af00 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1af10 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
1af20 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
1af30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1af40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1af50 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53  e3_column_text S
1af60 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1af70 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1af80 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
1af90 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1afa0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1afb0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d  _column_name STM
1afc0 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
1afd0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1afe0 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20  _utf8(.  void * 
1aff0 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
1b000 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1b010 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1b020 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1b030 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  e */.  Tcl_Inter
1b040 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b050 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b060 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b070 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1b080 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1b090 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
1b0a0 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
1b0b0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1b0c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
1b0d0 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  et;..  xFunc = (
1b0e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28  const char *(*)(
1b0f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1b100 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1b110 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1b120 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1b130 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1b140 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1b150 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1b160 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1b170 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1b180 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1b190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b1a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1b1b0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1b1c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b1d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b1e0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1b1f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1b200 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b210 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b220 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1b230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b240 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53   zRet = xFunc(pS
1b250 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
1b260 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c   zRet ){.    Tcl
1b270 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1b280 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c  p, (char *)zRet,
1b290 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1b2a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1b2b0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f  tic int test_glo
1b2c0 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76  bal_recover(.  v
1b2d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b2e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b2f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b300 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b310 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1b320 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b330 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52  IT_GLOBALRECOVER
1b340 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b350 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1b360 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1b370 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
1b380 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b390 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b3a0 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
1b3b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b3c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
1b3d0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b  lobal_recover();
1b3e0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1b3f0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1b400 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1b410 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23  , TCL_STATIC);.#
1b420 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 72  endif.#endif.  r
1b430 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b440 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b450 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1b460 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1b470 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b480 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1b490 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1b4a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b4b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
1b4c0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1b4d0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1b4e0 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69  tmt_utf16(.  voi
1b4f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1b500 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1b510 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1b520 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1b530 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
1b540 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b550 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b560 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b570 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1b580 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1b590 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1b5a0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1b5b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
1b5c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1b5d0 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20  Name16;.  const 
1b5e0 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73  void *(*xFunc)(s
1b5f0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1b600 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1b610 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28  const void *(*)(
1b620 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1b630 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1b640 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1b650 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1b660 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1b670 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1b680 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1b690 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1b6a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1b6b0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1b6c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b6d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1b6e0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1b6f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b700 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b710 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1b720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1b730 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b740 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b750 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1b760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1b770 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e    zName16 = xFun
1b780 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1b790 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a   if( zName16 ){.
1b7a0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63      int n;.    c
1b7b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1b7c0 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28  Name16;.    for(
1b7d0 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e  n=0; z[n] || z[n
1b7e0 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20  +1]; n+=2){}.   
1b7f0 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
1b800 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d  yteArrayObj(zNam
1b810 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54  e16, n+2);.    T
1b820 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b830 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
1b840 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1b850 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1b860 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  /..  return TCL_
1b870 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b880 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1b890 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
1b8a0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1b8b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1b8c0 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
1b8d0 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1b8e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1b8f0 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
1b900 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
1b910 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
1b920 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b930 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
1b940 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1b950 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1b960 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1b970 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b980 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b990 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b9a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1b9b0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1b9c0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
1b9d0 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
1b9e0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
1b9f0 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28    xFunc = (int (
1ba00 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1ba10 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1ba20 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1ba30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ba40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ba50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ba60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1ba70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1ba80 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1ba90 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1baa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1bac0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1bad0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1bae0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1baf0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1bb00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bb10 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1bb20 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1bb30 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1bb40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bb50 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1bb60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1bb70 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
1bb80 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
1bb90 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bbb0 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  :  sqlite_set_ma
1bbc0 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e  gic  DB  MAGIC-N
1bbd0 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20  UMBER.**.** Set 
1bbe0 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61  the db->magic va
1bbf0 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  lue.  This is us
1bc00 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  ed to test error
1bc10 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e   recovery logic.
1bc20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1bc30 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28  qlite_set_magic(
1bc40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1bc50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1bc60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1bc70 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1bc80 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1bc90 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1bca0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1bcb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bcc0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1bcd0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1bce0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1bcf0 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43        " DB MAGIC
1bd00 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1bd10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bd20 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1bd30 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1bd40 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1bd50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bd60 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1bd70 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1bd80 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20  C_OPEN")==0 ){. 
1bd90 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1bda0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1bdb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1bdc0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1bdd0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
1bde0 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  ED")==0 ){.    d
1bdf0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1be00 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
1be10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1be20 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1be30 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29  ITE_MAGIC_BUSY")
1be40 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1be50 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1be60 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  GIC_BUSY;.  }els
1be70 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1be80 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1be90 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29  GIC_ERROR")==0 )
1bea0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1beb0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
1bec0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
1bed0 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1bee0 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69  erp, argv[2], (i
1bef0 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20  nt*)&db->magic) 
1bf00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1bf10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1bf20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1bf30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1bf40 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1bf50 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
1bf60 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
1bf70 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
1bf80 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
1bf90 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
1bfa0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1bfb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bfc0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1bfd0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1bfe0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1bff0 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1c000 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c010 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c020 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c030 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1c040 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1c050 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1c070 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1c080 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1c090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c0a0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
1c0b0 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
1c0c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c0d0 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
1c0e0 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1c0f0 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
1c100 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
1c110 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
1c120 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
1c130 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
1c140 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1c150 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
1c160 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
1c170 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 3b  <sizeof(bigBuf);
1c180 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20   i++) bigBuf[i] 
1c190 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20  = 0xdeadbeef;.  
1c1a0 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1c1b0 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62  seline = (u8*)&b
1c1c0 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a  igBuf[65536];.}.
1c1d0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
1c1e0 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70  urrent stack dep
1c1f0 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  th.  Used for de
1c200 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
1c210 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63  .u64 sqlite3Stac
1c220 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20  kDepth(void){.  
1c230 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28  u8 x;.  return (
1c240 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61  u64)(sqlite3_sta
1c250 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78  ck_baseline - &x
1c260 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
1c270 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  e:  sqlite3_stac
1c280 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a  k_used DB SQL.**
1c290 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75  .** Try to measu
1c2a0 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  re the amount of
1c2b0 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65   stack space use
1c2c0 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
1c2d0 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73  qlite3_exec.*/.s
1c2e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1c2f0 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69  tack_used(.  voi
1c300 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c310 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c320 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1c330 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1c340 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c350 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1c360 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1c370 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c380 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c390 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c3a0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1c3b0 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51  .        " DB SQ
1c3c0 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
1c3d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c3e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1c3f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1c400 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1c410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c420 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20   prepStack();.  
1c430 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
1c440 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
1c450 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
1c460 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26  i=65535; i>=0 &&
1c470 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f   ((u32*)sqlite3_
1c480 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b  stack_baseline)[
1c490 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b  -i]==0xdeadbeef;
1c4a0 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65   i--){}.  Tcl_Se
1c4b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c4c0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1c4d0 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  (i*4));.  return
1c4e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c4f0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1c500 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
1c510 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1c520 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
1c530 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1c540 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
1c550 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1c560 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
1c570 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1c580 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1c590 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1c5a0 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
1c5b0 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
1c5c0 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
1c5d0 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1c5e0 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1c5f0 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74  int delete_funct
1c600 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1c610 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c620 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c630 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1c640 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1c650 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1c660 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1c670 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1c680 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c690 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c6a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c6b0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1c6c0 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1c6d0 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1c6e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c6f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1c700 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1c710 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1c720 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c730 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1c740 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1c750 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1c760 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1c770 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
1c780 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1c790 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1c7a0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1c7b0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1c7c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c7d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c7e0 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
1c7f0 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f  tion DB collatio
1c800 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1c810 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ete the collatio
1c820 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c  n sequence 'coll
1c830 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ation-name' from
1c840 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c850 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61   .** DB. It is a
1c860 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1c870 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c880 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61  ce was created a
1c890 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20  s UTF8 (the .** 
1c8a0 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1c8b0 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1c8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1c8d0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  lete_collation(.
1c8e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c8f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c900 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c910 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1c920 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1c930 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1c940 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1c950 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c970 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1c980 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1c990 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1c9a0 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1c9b0 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1c9c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c9d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1c9e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1c9f0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ca00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ca10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1ca20 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
1ca30 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49  b, argv[2], SQLI
1ca40 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a  TE_UTF8, 0, 0);.
1ca50 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1ca60 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1ca70 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1ca80 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1ca90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1caa0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1cab0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1cac0 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52  ommit DB.**.** R
1cad0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1cae0 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73  e database DB is
1caf0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75   currently in au
1cb00 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1cb10 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1cb20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1cb30 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f  c int get_autoco
1cb40 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
1cb50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1cb60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1cb70 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1cb80 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1cb90 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1cba0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1cbb0 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1cbc0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1cbd0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1cbe0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1cbf0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1cc00 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1cc10 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cc20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cc30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1cc40 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1cc50 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1cc60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cc70 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
1cc80 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  d", sqlite3_get_
1cc90 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b  autocommit(db));
1cca0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1ccb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1ccc0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1ccd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1cce0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
1ccf0 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d  usy_timeout DB M
1cd00 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  S.**.** Set the 
1cd10 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54  busy timeout.  T
1cd20 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69  his is more easi
1cd30 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68  ly done using th
1cd40 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74  e timeout.** met
1cd50 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69  hod of the TCL i
1cd60 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77  nterface.  But w
1cd70 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20  e need a way to 
1cd80 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a  test the case.**
1cd90 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e   where it return
1cda0 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
1cdb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cdc0 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
1cdd0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1cde0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1cdf0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ce00 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1ce10 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1ce20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65  rc, ms;.  sqlite
1ce30 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1ce40 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ce50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ce60 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ce70 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ce80 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1ce90 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1cea0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ceb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1cec0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1ced0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1cee0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1cef0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1cf00 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1cf10 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  argv[2], &ms) ) 
1cf20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cf30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1cf40 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
1cf50 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , ms);.  Tcl_App
1cf60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cf70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
1cf80 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1cf90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1cfa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1cfb0 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
1cfc0 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45  ype VARIABLENAME
1cfd0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cfe0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1cff0 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
1d000 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
1d010 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69   value of the gi
1d020 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ven variable..*/
1d030 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f  .static int tcl_
1d040 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20  variable_type(. 
1d050 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d060 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1d070 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1d080 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1d090 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1d0a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72  .  Tcl_Obj *pVar
1d0b0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1d0c0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1d0d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1d0e0 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42  1, objv, "VARIAB
1d0f0 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
1d100 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d110 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74    pVar = Tcl_Get
1d120 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54  Var2Ex(interp, T
1d130 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d140 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45  v[1]), 0, TCL_LE
1d150 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20  AVE_ERR_MSG);.  
1d160 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65  if( pVar==0 ) re
1d170 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d180 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65    if( pVar->type
1d190 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ptr ){.    Tcl_S
1d1a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d1b0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
1d1c0 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50  gObj(pVar->typeP
1d1d0 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  tr->name, -1));.
1d1e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1d1f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1d200 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
1d210 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f  lease_memory ?N?
1d220 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1d230 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1d240 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1d250 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
1d260 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68   required..** Th
1d270 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74  e integer N is t
1d280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1d290 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  es we are trying
1d2a0 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68   to release.  Th
1d2b0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  e .** return val
1d2c0 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  ue is the amount
1d2d0 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61   of memory actua
1d2e0 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  lly released..*/
1d2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d300 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1d310 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d320 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d330 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d340 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d350 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d360 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1d370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1d380 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
1d390 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1d3a0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
1d3b0 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
1d3c0 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1d3d0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1d3e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1d3f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1d400 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1d410 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d420 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
1d430 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
1d440 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d450 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d460 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
1d470 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
1d480 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
1d490 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1d4a0 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1d4b0 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
1d4c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d4d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1d4e0 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
1d4f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d500 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d510 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1d520 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
1d530 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
1d540 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
1d550 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
1d560 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
1d570 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
1d580 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
1d590 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
1d5a0 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
1d5b0 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
1d5c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d5d0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
1d5e0 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
1d5f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1d600 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d610 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d620 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d630 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
1d640 63 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c 69  c int softHeapLi
1d650 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  mit = 0;.  int a
1d660 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1d670 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1d680 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1d690 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1d6a0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1d6b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d6c0 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  OR;.  }.  amt = 
1d6d0 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a 20  softHeapLimit;. 
1d6e0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
1d6f0 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 69      int N;.    i
1d700 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1d710 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1d720 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1d730 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d740 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
1d750 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20 20  eap_limit(N);.  
1d760 20 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 20    softHeapLimit 
1d770 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  = N;.  }.  Tcl_S
1d780 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d790 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1d7a0 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72  j(amt));.  retur
1d7b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d7c0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1d7d0 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1d7e0 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  up.**.** Call th
1d7f0 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
1d800 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f  _cleanup API..*/
1d810 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d820 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1d830 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d840 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d850 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d860 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d870 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d880 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1d890 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1d8a0 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  D.  sqlite3_thre
1d8b0 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65  ad_cleanup();.#e
1d8c0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1d8d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d8e0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1d8f0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
1d900 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1d910 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65   a list of numbe
1d920 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  rs which are the
1d930 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66   PagerRefcount f
1d940 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73  or all.** pagers
1d950 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
1d960 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
1d970 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d980 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
1d990 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d9a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d9b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d9c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d9d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d9e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1d9f0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
1da00 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f  t v, *a;.  Tcl_O
1da10 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20  bj *pResult;..  
1da20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1da30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1da40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1da50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1da60 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1da70 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1da80 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1da90 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
1daa0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1dab0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1dac0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1dad0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1dae0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1daf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1db00 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d  ROR;.  pResult =
1db10 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
1db20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1db30 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
1db40 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
1db50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  t==0 ){.      v 
1db60 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1db70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1db80 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1db90 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d  utex);.      a =
1dba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61   sqlite3PagerSta
1dbb0 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
1dbc0 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  ager(db->aDb[i].
1dbd0 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d  pBt));.      v =
1dbe0 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c   a[0];.      sql
1dbf0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1dc00 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1dc10 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
1dc20 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1dc30 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
1dc40 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
1dc50 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
1dc60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1dc70 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
1dc80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1dc90 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
1dca0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
1dcb0 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
1dcc0 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
1dcd0 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
1dce0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
1dcf0 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
1dd00 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
1dd10 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
1dd20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
1dd30 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
1dd40 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
1dd50 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1dd60 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
1dd70 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
1dd80 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
1dd90 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
1dda0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
1ddb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
1ddc0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
1ddd0 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
1dde0 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
1ddf0 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
1de00 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
1de10 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
1de20 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
1de30 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
1de40 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
1de50 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
1de60 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
1de70 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
1de80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1de90 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1dea0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1deb0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1dec0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1ded0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1dee0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1def0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1df00 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1df10 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1df20 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1df30 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1df40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1df50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1df60 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1df70 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1df80 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1df90 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
1dfa0 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a  cl_Obj *pTestObj
1dfb0 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20  ;.  int working 
1dfc0 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a  = 0;..  pTestObj
1dfd0 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
1dfe0 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36  tObj(1000000*(i6
1dff0 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20  4)1234567890);. 
1e000 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d   working = strcm
1e010 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
1e020 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34  pTestObj), "1234
1e030 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d  567890000000")==
1e040 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  0;.  Tcl_DecrRef
1e050 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b  Count(pTestObj);
1e060 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1e070 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1e080 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f  NewBooleanObj(wo
1e090 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72  rking));.  retur
1e0a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
1e0b0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
1e0c0 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a  s_unlink_test.**
1e0d0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
1e0e0 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73  mand unregisters
1e0f0 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53   the primary VFS
1e100 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74   and then regist
1e110 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61  ers.** it back a
1e120 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75  gain.  This is u
1e130 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
1e140 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73  ability to regis
1e150 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65  ter a.** VFS whe
1e160 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69  n none are previ
1e170 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
1e180 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74  , and the abilit
1e190 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73  y to .** unregis
1e1a0 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61  ter the only ava
1e1b0 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63  ilable VFS.  Tic
1e1c0 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61  ket #2738.*/.sta
1e1d0 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69  tic int vfs_unli
1e1e0 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nk_test(.  Clien
1e1f0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1e200 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1e210 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1e220 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1e230 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e240 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1e250 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1e260 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1e270 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1e280 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1e290 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e2a0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1e2b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e2c0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1e2d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1e2e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
1e2f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e  lite3_vfs *pMain
1e300 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
1e310 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71  *apVfs[20];.  sq
1e320 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74  lite3_vfs one, t
1e330 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  wo;..  sqlite3_v
1e340 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29  fs_unregister(0)
1e350 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ;   /* Unregiste
1e360 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72  r of NULL is har
1e370 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a  mless */.  one.z
1e380 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
1e390 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f    two.zName = "_
1e3a0 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c  _two";..  /* Cal
1e3b0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ling sqlite3_vfs
1e3c0 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32  _register with 2
1e3d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30  nd argument of 0
1e3e0 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63   does not.  ** c
1e3f0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
1e400 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61  t VFS.  */.  pMa
1e410 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  in = sqlite3_vfs
1e420 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69  _find(0);.  sqli
1e430 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1e440 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73  (&one, 0);.  ass
1e450 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
1e460 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
1e470 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1e480 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1e490 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a  ister(&two, 0);.
1e4a0 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
1e4b0 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
1e4c0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1e4d0 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e   );..  /* We can
1e4e0 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69   find a VFS by i
1e4f0 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73  ts name */.  ass
1e500 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1e510 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
1e520 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
1e530 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1e540 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
1e550 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  o );..  /* Calli
1e560 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65  ng sqlite_vfs_re
1e570 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d  gister with non-
1e580 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61  zero second para
1e590 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68  meter changes th
1e5a0 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56  e.  ** default V
1e5b0 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  FS, even if the 
1e5c0 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  1st parameter is
1e5d0 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20   an existig VFS 
1e5e0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65  that is.  ** pre
1e5f0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
1e600 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65  ed as the non-de
1e610 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  fault..  */.  sq
1e620 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1e630 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61  er(&one, 1);.  a
1e640 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1e650 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
1e660 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
1e670 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1e680 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
1e690 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
1e6a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1e6b0 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  d(0)==&one );.  
1e6c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1e6d0 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20  ster(&two, 1);. 
1e6e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e6f0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1e700 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
1e710 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1e720 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
1e730 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72  =&two );.  asser
1e740 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1e750 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a  ind(0)==&two );.
1e760 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20    if( pMain ){. 
1e770 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1e780 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31  egister(pMain, 1
1e790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1e7a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1e7b0 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
1e7c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1e7d0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1e7e0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
1e7f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1e800 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1e810 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20  ==pMain );.  }. 
1e820 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68   .  /* Unlink th
1e830 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20  e default VFS.  
1e840 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
1e850 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56  re are no more V
1e860 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74  FSes.  ** regist
1e870 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ered..  */.  for
1e880 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
1e890 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
1e8a0 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  fs[0]); i++){.  
1e8b0 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
1e8c0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1e8d0 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
1e8e0 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i] ){.      asse
1e8f0 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
1e900 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61  lite3_vfs_find(a
1e910 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20  pVfs[i]->zName) 
1e920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e930 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1e940 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20  apVfs[i]);.     
1e950 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1e960 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
1e970 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
1e980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1e990 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
1e9a0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1e9b0 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20   .  /* Register 
1e9c0 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20  the main VFS as 
1e9d0 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c  non-default (wil
1e9e0 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c  l be made defaul
1e9f0 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74  t, since.  ** it
1ea00 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  'll be the only 
1ea10 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65  one in existence
1ea20 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
1ea30 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
1ea40 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65  Main, 0);.  asse
1ea50 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1ea60 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
1ea70 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67  ;.  .  /* Un-reg
1ea80 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56  ister the main V
1ea90 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74  FS again to rest
1eaa0 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53  ore an empty VFS
1eab0 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
1eac0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1ead0 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65  r(pMain);.  asse
1eae0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
1eaf0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
1eb00 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56   /* Relink all V
1eb10 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  FSes in reverse 
1eb20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f  order. */  .  fo
1eb30 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73  r(i=sizeof(apVfs
1eb40 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
1eb50 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ])-1; i>=0; i--)
1eb60 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  {.    if( apVfs[
1eb70 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i] ){.      sqli
1eb80 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1eb90 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20  (apVfs[i], 1);. 
1eba0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
1ebb0 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
1ebc0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
1ebd0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
1ebe0 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
1ebf0 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
1ec00 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
1ec10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  .  }..  /* Unreg
1ec20 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65  ister out sample
1ec30 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   VFSes. */.  sql
1ec40 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1ec50 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c  ter(&one);.  sql
1ec60 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1ec70 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a  ter(&two);..  /*
1ec80 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61   Unregistering a
1ec90 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74   VFS that is not
1eca0 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
1ecb0 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73  tered is harmles
1ecc0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
1ecd0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
1ece0 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
1ecf0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
1ed00 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  wo);.  assert( s
1ed10 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1ed20 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20  "__one")==0 );. 
1ed30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ed40 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
1ed50 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ")==0 );..  /* W
1ed60 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74  e should be left
1ed70 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e   with the origin
1ed80 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62  al default VFS b
1ed90 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ack as the.  ** 
1eda0 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73  original */.  as
1edb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1edc0 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e  s_find(0)==pMain
1edd0 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
1ede0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
1edf0 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69  clcmd:   vfs_ini
1ee00 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  tfail_test.**.**
1ee10 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
1ee20 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66  d attempts to vf
1ee30 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72  s_find and vfs_r
1ee40 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65  egister when the
1ee50 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  .** sqlite3_init
1ee60 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61  ialize() interfa
1ee70 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20  ce is failing.  
1ee80 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64  All calls should
1ee90 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   fail..*/.static
1eea0 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69   int vfs_initfai
1eeb0 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
1eec0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1eed0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1eee0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1eef0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1ef00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef10 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1ef20 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1ef30 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1ef40 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1ef50 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1ef60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ef70 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1ef80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ef90 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1efa0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1efb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1efc0 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  one;.  one.zName
1efd0 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69   = "__one";..  i
1efe0 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
1eff0 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
1f000 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1f010 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1f020 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66  r(&one, 0);.  if
1f030 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1f040 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
1f050 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
1f060 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1f070 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28  (&one, 1);.  if(
1f080 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1f090 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
1f0a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
1f0b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f0c0 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a  ** Saved VFSes.*
1f0d0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1f0e0 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
1f0f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73  .static int nVfs
1f100 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c   = 0;../*.** tcl
1f110 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67  cmd:   vfs_unreg
1f120 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20  ister_all.**.** 
1f130 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56  Unregister all V
1f140 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  FSes..*/.static 
1f150 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74  int vfs_unregist
1f160 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74  er_all(.  Client
1f170 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1f180 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1f190 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1f1a0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1f1b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f1c0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f1d0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f1e0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f1f0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f200 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1f210 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f220 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f230 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f240 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1f250 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1f260 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1f270 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1f280 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a  e(apVfs); i++){.
1f290 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73      apVfs[i] = s
1f2a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1f2b0 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66  0);.    if( apVf
1f2c0 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  s[i]==0 ) break;
1f2d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1f2e0 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
1f2f0 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66  s[i]);.  }.  nVf
1f300 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20  s = i;.  return 
1f310 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
1f320 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65  tclcmd:   vfs_re
1f330 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
1f340 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56  ** Restore all V
1f350 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72  FSes that were r
1f360 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73  emoved using vfs
1f370 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _unregister_all.
1f380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
1f390 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
1f3a0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1f3b0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1f3c0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1f3d0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1f3e0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1f3f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1f400 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1f410 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1f420 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1f430 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f450 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1f460 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1f470 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1f480 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1f490 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
1f4a0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f4b0 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVfs; i++){.  
1f4c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1f4d0 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c  gister(apVfs[i],
1f4e0 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
1f4f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f500 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1f510 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
1f520 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
1f530 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
1f540 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
1f550 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
1f560 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
1f570 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
1f580 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
1f590 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
1f5a0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  t file_control_t
1f5b0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
1f5c0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1f5d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1f5e0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1f5f0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1f600 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f610 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1f620 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1f630 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1f640 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1f650 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1f660 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1f670 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1f680 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1f690 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1f6a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1f6b0 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
1f6c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1f6d0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1f6e0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1f6f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f700 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f710 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f720 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
1f730 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1f740 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
1f750 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1f760 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f770 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1f780 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1f790 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f7a0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1f7b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1f7d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1f7e0 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20  0, 0, &iArg);.  
1f7f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1f800 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
1f810 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
1f820 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74  control(db, "not
1f830 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49  adatabase", SQLI
1f840 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
1f850 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  TE, &iArg);.  as
1f860 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1f870 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d  _ERROR );.  rc =
1f880 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1f890 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
1f8a0 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20  , -1, &iArg);.  
1f8b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1f8c0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
1f8d0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
1f8e0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d  control(db, "tem
1f8f0 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  p", -1, &iArg);.
1f900 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1f910 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
1f920 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f930 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
1f940 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
1f950 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20  _lasterrno_test 
1f960 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
1f970 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
1f980 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
1f990 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
1f9a0 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
1f9b0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
1f9c0 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
1f9d0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72  E_LAST_ERRNO ver
1f9e0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
1f9f0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
1fa00 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20  sterrno_test(.  
1fa10 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1fa20 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
1fa30 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
1fa40 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
1fa50 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1fa60 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1fa70 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1fa80 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1fa90 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1faa0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
1fab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1fac0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1fad0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
1fae0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
1faf0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
1fb00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
1fb10 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
1fb20 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1fb30 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1fb40 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1fb50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1fb60 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1fb70 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
1fb80 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1fb90 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1fba0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
1fbb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fbc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fbd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1fbe0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1fbf0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1fc00 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
1fc10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fc20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1fc30 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
1fc40 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c  , NULL, SQLITE_L
1fc50 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67  AST_ERRNO, &iArg
1fc60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
1fc70 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1fc80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1fc90 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
1fca0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
1fcb0 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69  _ERROR; .  }.  i
1fcc0 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20  f( iArg!=0 ) {. 
1fcd0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1fce0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65  ult(interp, "Une
1fcf0 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f  xpected non-zero
1fd00 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20   errno: ",.     
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1fd30 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f  mObj(Tcl_NewIntO
1fd40 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20  bj(iArg), 0), " 
1fd50 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1fd60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1fd70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1fd80 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
1fd90 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
1fda0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
1fdb0 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20  st DB PWD.**.** 
1fdc0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1fdd0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
1fde0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
1fdf0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
1fe00 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
1fe10 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1fe20 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
1fe30 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
1fe40 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
1fe50 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
1fe60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fe70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
1fe80 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43  kproxy_test(.  C
1fe90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1fea0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1feb0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1fec0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1fed0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1fee0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1fef0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1ff00 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1ff10 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1ff20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1ff30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ff40 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ff50 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1ff60 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1ff70 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1ff80 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1ff90 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
1ffa0 61 72 20 2a 7a 50 77 64 3b 0a 20 20 69 6e 74 20  ar *zPwd;.  int 
1ffb0 6e 50 77 64 3b 0a 20 20 0a 20 20 69 66 28 20 6f  nPwd;.  .  if( o
1ffc0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1ffd0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ffe0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1fff0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20000 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
20010 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
20020 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
20030 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
20040 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20 72   PWD", 0);.    r
20050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20060 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
20070 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20080 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20090 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
200a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
200b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 77 64 20  ROR;.  }.  zPwd 
200c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
200d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
200e0 26 6e 50 77 64 29 3b 0a 20 20 0a 23 69 66 20 21  &nPwd);.  .#if !
200f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
20100 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20110 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e  YLE).#  if defin
20120 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20  ed(__APPLE__).# 
20130 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
20140 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
20150 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a  STYLE 1.#  else.
20160 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
20170 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20180 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64  G_STYLE 0.#  end
20190 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
201a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
201b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
201c0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
201d0 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65    {.    char *te
201e0 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20  stPath;.    int 
201f0 72 63 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  rc;.    char pro
20200 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
20210 20 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66   .    if( sizeof
20220 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64  (proxyPath)<nPwd
20230 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  +20 ){.      Tcl
20240 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20250 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62  terp, "PWD too b
20260 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  ig", (void*)0);.
20270 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
20280 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
20290 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79 50    sprintf(proxyP
202a0 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72  ath, "%s/test.pr
202b0 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20  oxy", zPwd);.   
202c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
202d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
202e0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ULL, SQLITE_SET_
202f0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70  LOCKPROXYFILE, p
20300 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69  roxyPath);.    i
20310 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
20320 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
20330 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
20340 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
20350 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20360 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
20370 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
20380 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
20390 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  L, SQLITE_GET_LO
203a0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65  CKPROXYFILE, &te
203b0 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  stPath);.    if(
203c0 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61   strncmp(proxyPa
203d0 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20  th,testPath,11) 
203e0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
203f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
20400 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69  , "Lock proxy fi
20410 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  le did not match
20420 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20   the ".         
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c        "previousl
20450 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  y assigned value
20460 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
20470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20480 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
20490 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
204a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
204b0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
204c0 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rc));.      retu
204d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
204e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
204f0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
20500 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
20510 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
20520 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29  FILE, proxyPath)
20530 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
20540 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
20550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20560 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
20570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20580 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
20590 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
205a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
205b0 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
205c0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c     sqlite3_vfs_l
205d0 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75  ist.**.**   Retu
205e0 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f  rn a tcl list co
205f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
20600 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74  es of all regist
20610 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73  ered vfs's..*/.s
20620 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69  tatic int vfs_li
20630 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
20640 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
20650 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
20660 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
20670 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
20680 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
20690 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
206a0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
206b0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
206c0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
206d0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
206e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
206f0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
20700 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20710 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
20720 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
20730 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20740 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  s;.  Tcl_Obj *pR
20750 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
20760 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  );.  if( objc!=1
20770 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
20780 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
20790 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
207a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
207b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ROR;.  }.  for(p
207c0 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  Vfs=sqlite3_vfs_
207d0 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70  find(0); pVfs; p
207e0 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29  Vfs=pVfs->pNext)
207f0 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  {.    Tcl_ListOb
20800 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
20810 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
20820 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
20830 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b  fs->zName, -1));
20840 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
20850 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20860 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  pRet);.  return 
20870 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
20880 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
20890 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44  ite3_limit DB ID
208a0 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69   VALUE.**.** Thi
208b0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
208c0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  ns the sqlite3_l
208d0 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20 61  imit interface a
208e0 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
208f0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
20900 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
20910 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
20920 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74  _limit(.  Client
20930 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
20940 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
20950 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
20960 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
20970 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20980 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20990 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
209a0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
209b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
209c0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
209d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
209e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
209f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20a00 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
20a10 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
20a20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
20a30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61  .  int rc;.  sta
20a40 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
20a50 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
20a60 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64  ame;.     int id
20a70 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a  ;.  } aId[] = {.
20a80 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
20a90 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  MIT_LENGTH",    
20aa0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20ab0 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
20ad0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
20ae0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20  IT_SQL_LENGTH", 
20af0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20b00 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
20b10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
20b20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
20b30 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20  T_COLUMN",      
20b40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
20b50 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
20b60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
20b70 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
20b80 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20  _EXPR_DEPTH",   
20b90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
20ba0 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
20bb0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
20bc0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
20bd0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22  COMPOUND_SELECT"
20be0 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
20bf0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
20c00 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  CT      },.    {
20c10 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
20c20 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20  DBE_OP",        
20c30 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
20c40 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
20c50 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
20c60 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  "SQLITE_LIMIT_FU
20c70 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20  NCTION_ARG",    
20c80 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
20c90 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
20ca0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
20cb0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
20cc0 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20  ACHED",         
20cd0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
20ce0 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
20cf0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
20d00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
20d10 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22  _PATTERN_LENGTH"
20d20 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
20d30 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
20d40 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  TH  },.    { "SQ
20d50 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
20d60 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20  BLE_NUMBER",    
20d70 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
20d80 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
20d90 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
20da0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
20db0 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
20dc0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
20dd0 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
20de0 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a    },.    .    /*
20df0 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65   Out of range te
20e00 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20  st cases */.    
20e10 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
20e20 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20  TOOSMALL",      
20e30 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20        -1,       
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
20e60 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
20e70 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20  OOBIG",         
20e80 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
20e90 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b  T_TRIGGER_DEPTH+
20ea0 31 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20  1      },.  };. 
20eb0 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e   int i, id;.  in
20ec0 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t val;.  const c
20ed0 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28  har *zId;..  if(
20ee0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
20ef0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
20f00 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
20f10 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
20f20 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
20f30 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
20f40 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
20f50 20 22 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c   " DB ID VALUE",
20f60 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
20f70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
20f80 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
20f90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
20fa0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
20fb0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
20fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64  TCL_ERROR;.  zId
20fd0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
20fe0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (objv[2]);.  for
20ff0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
21000 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
21010 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
21020 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49  ( strcmp(zId, aI
21030 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  d[i].zName)==0 )
21040 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49 64  {.      id = aId
21050 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72  [i].id;.      br
21060 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
21070 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
21080 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30  Id)/sizeof(aId[0
21090 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  ]) ){.    Tcl_Ap
210a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
210b0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69  p, "unknown limi
210c0 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20  t type: ", zId, 
210d0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
210e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
210f0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
21100 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
21110 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
21120 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
21130 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
21140 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
21150 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c   id, val);.  Tcl
21160 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21170 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
21180 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
21190 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
211a0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
211b0 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ave_prng_state.*
211c0 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74  *.** Save the st
211d0 61 74 65 20 6f 66 20 74 68 65 20 70 73 65 75 64  ate of the pseud
211e0 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  o-random number 
211f0 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74  generator..** At
21200 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
21210 76 65 72 69 66 79 20 74 68 61 74 20 73 71 6c 69  verify that sqli
21220 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
21230 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e   works even when
21240 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
21250 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  an out-of-range 
21260 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
21270 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f  c int save_prng_
21280 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
21290 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
212a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
212b0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
212c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
212d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
212e0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
212f0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21300 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21310 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21320 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21330 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21340 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21350 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21360 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21370 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21380 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
21390 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
213a0 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74  (9999);.  assert
213b0 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20  ( rc==0 );.  rc 
213c0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
213d0 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73  ontrol(-1);.  as
213e0 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
213f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
21400 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
21410 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29  TCTRL_PRNG_SAVE)
21420 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21430 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
21440 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  d:  restore_prng
21450 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
21460 20 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e   int restore_prn
21470 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
21480 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
21490 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
214a0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
214b0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
214c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
214d0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
214e0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
214f0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
21500 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
21510 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
21520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21530 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
21540 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21550 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
21560 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
21570 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
21580 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
21590 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
215a0 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72  ESTORE);.  retur
215b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
215c0 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74  * tclcmd:  reset
215d0 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
215e0 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f  tatic int reset_
215f0 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
21600 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
21610 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
21620 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
21630 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
21640 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
21650 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
21660 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
21670 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
21680 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
21690 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
216a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
216b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
216c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
216d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
216e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
216f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
21700 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
21710 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
21720 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75  G_RESET);.  retu
21730 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
21740 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61  .** tclcmd:  pca
21750 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61  che_stats.*/.sta
21760 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61  tic int test_pca
21770 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69  che_stats(.  Cli
21780 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21790 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
217a0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
217b0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
217c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
217d0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
217e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
217f0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21800 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21810 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21820 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21830 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21840 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21850 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21860 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21870 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b  /.){.  int nMin;
21880 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69  .  int nMax;.  i
21890 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69  nt nCurrent;.  i
218a0 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a  nt nRecyclable;.
218b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
218c0 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
218d0 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74  eStats(&nCurrent
218e0 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20  , &nMax, &nMin, 
218f0 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a  &nRecyclable);..
21900 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
21910 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
21920 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21930 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
21940 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
21950 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29  ("current", -1))
21960 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
21970 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21980 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
21990 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e  ewIntObj(nCurren
219a0 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
219b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
219c0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
219d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
219e0 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  max", -1));.  Tc
219f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
21a00 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
21a10 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
21a20 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c  bj(nMax));.  Tcl
21a30 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
21a40 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
21a50 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
21a60 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29  gObj("min", -1))
21a70 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
21a80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a90 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
21aa0 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b  ewIntObj(nMin));
21ab0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
21ac0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
21ad0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
21ae0 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79  wStringObj("recy
21af0 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20  clable", -1));. 
21b00 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
21b10 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
21b20 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
21b30 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c  ntObj(nRecyclabl
21b40 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  e));..  Tcl_SetO
21b50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
21b60 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
21b70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
21b80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
21b90 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
21ba0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
21bb0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
21bc0 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69  b(void **aArg, i
21bd0 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20  nt nArg){.  int 
21be0 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
21bf0 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a  ii<nArg; ii++){.
21c00 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28      Tcl_EvalEx((
21c10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72  Tcl_Interp *)aAr
21c20 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e  g[ii], "unlock_n
21c30 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f  otify", -1, TCL_
21c40 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
21c50 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
21c60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
21c70 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a  CK_NOTIFY */../*
21c80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
21c90 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
21ca0 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20  fy db.*/.#ifdef 
21cb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
21cc0 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
21cd0 69 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f  ic int test_unlo
21ce0 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69  ck_notify(.  Cli
21cf0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21d00 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
21d10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21d20 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21d30 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21d40 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21d50 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21d60 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21d80 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21d90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21da0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21db0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21dc0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
21dd0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
21de0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
21df0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
21e00 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
21e10 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
21e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21e30 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
21e40 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21e50 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
21e60 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
21e70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
21e80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
21e90 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  c = sqlite3_unlo
21ea0 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65  ck_notify(db, te
21eb0 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
21ec0 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74  _cb, (void *)int
21ed0 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  erp);.  Tcl_SetR
21ee0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
21ef0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
21f00 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
21f10 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
21f20 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
21f30 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
21f40 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
21f50 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a  oint db ?NAME?.*
21f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
21f70 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
21f80 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
21f90 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
21fa0 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
21fb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
21fc0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
21fd0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21fe0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21ff0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22010 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
22020 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
22030 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
22040 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
22050 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
22060 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73  ar *zDb = 0;.  s
22070 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
22080 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
22090 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=3 && objc!=2 
220a0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
220b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
220c0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41  1, objv, "DB ?NA
220d0 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
220e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
220f0 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
22100 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
22110 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22120 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
22130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22140 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
22150 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20  c==3 ){.    zDb 
22160 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
22170 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
22180 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
22190 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
221a0 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  zDb);.  Tcl_SetR
221b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
221c0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
221d0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
221e0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
221f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20  _OK;.}.../*.**  
22200 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43     tcl_objproc C
22210 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e  OMMANDNAME ARGS.
22220 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54  ...**.** Run a T
22230 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67  CL command using
22240 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74   its objProc int
22250 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61  erface.  Throw a
22260 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68  n error if.** th
22270 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f  e command has no
22280 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61   objProc interfa
22290 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
222a0 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a  t runAsObjProc(.
222b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
222c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
222d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
222e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
222f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
22300 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
22310 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f  cmdInfo;.  if( o
22320 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
22330 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
22340 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
22350 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
22360 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22370 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ROR;.  }.  if( !
22380 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
22390 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
223a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
223b0 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
223c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
223d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
223e0 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
223f0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54   ",.           T
22400 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
22410 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
22420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22430 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22440 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f  ( cmdInfo.objPro
22450 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c==0 ){.    Tcl_
22460 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
22470 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61  erp, "command ha
22480 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c  s no objProc: ",
22490 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
224a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
224b0 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
224c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
224d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
224e0 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f  n cmdInfo.objPro
224f0 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  c(cmdInfo.objCli
22500 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c  entData, interp,
22510 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29   objc-1, objv+1)
22520 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ;.}.../*.** Regi
22530 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
22540 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
22550 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
22560 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
22570 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22580 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  rp){.  extern in
22590 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
225a0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
225b0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75   int sqlite3_fou
225c0 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  nd_count;.  exte
225d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
225e0 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
225f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
22600 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
22610 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
22620 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
22630 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
22640 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
22650 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51  ent_time;.#if SQ
22660 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
22670 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22680 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
22690 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
226a0 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  E.  extern int s
226b0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
226c0 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65  m;.#endif.  exte
226d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
226e0 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
226f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
22700 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
22710 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
22750 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
22760 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
22770 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
22780 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
22790 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
227a0 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
227b0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
227c0 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
227e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
227f0 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
22800 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
22810 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
22830 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
22840 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
22850 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22860 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
22870 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
22880 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22890 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
228a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
228b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
228c0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
228d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
228e0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
228f0 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
22900 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
22910 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ng",          (T
22920 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22930 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
22940 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22950 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
22960 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
22970 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22980 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
22990 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
229a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
229b0 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
229c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
229d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
229e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
229f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
22a00 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
22a10 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22a20 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
22a30 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
22a40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
22a50 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
22a60 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22a70 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
22a80 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
22a90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
22aa0 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
22ab0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22ac0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
22ad0 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
22ae0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
22af0 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
22b00 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
22b10 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
22b20 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
22b30 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
22b40 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
22b50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
22b60 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
22b70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
22b80 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
22b90 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
22ba0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
22bb0 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
22bc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
22bd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
22be0 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
22bf0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
22c00 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
22c10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22c20 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
22c30 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
22c40 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
22c50 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
22c60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
22c70 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
22c80 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
22c90 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
22ca0 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
22cb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22cc0 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20  _exec_hex",     
22cd0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
22ce0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
22cf0 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a  _hex         },.
22d00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22d10 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20  exec",          
22d20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
22d30 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20  Proc*)test_exec 
22d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
22d50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
22d60 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20  xec_nr",        
22d70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
22d80 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e  roc*)test_exec_n
22d90 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  r          },.#i
22da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22db0 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20  T_GET_TABLE.    
22dc0 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
22dd0 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
22de0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
22df0 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
22e00 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69  _printf },.#endi
22e10 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
22e20 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  3_close",       
22e30 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
22e40 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
22e50 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c  est_close     },
22e60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22e70 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
22e80 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
22e90 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
22ea0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a  te_function  },.
22eb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22ec0 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
22ed0 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
22ee0 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
22ef0 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20  e_aggregate },. 
22f00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65      { "sqlite_re
22f10 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63  gister_test_func
22f20 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50  tion", (Tcl_CmdP
22f30 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74  roc*)test_regist
22f40 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20  er_func    },.  
22f50 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f     { "sqlite_abo
22f60 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
22f70 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
22f80 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74  oc*)sqlite_abort
22f90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
22fa0 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64    { "sqlite_bind
22fb0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
22fc0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
22fd0 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20  c*)test_bind    
22fe0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
22ff0 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c   { "breakpoint",
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
23020 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  *)test_breakpoin
23030 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
23040 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c  { "sqlite3_key",
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
23070 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20  )test_key       
23080 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
23090 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22   "sqlite3_rekey"
230a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
230b0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
230c0 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20  test_rekey      
230d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
230e0 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69  "sqlite_set_magi
230f0 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
23100 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
23110 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
23120 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
23130 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
23140 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
23150 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
23160 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20  st_interrupt    
23170 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
23180 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e  qlite_delete_fun
23190 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28  ction",        (
231a0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c  Tcl_CmdProc*)del
231b0 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20  ete_function    
231c0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
231d0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
231e0 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ation",       (T
231f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
23200 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20  te_collation    
23210 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
23220 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
23230 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  mit",        (Tc
23240 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61  l_CmdProc*)get_a
23250 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20  utocommit       
23260 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
23270 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c  te3_stack_used",
23280 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
23290 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
232a0 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20  tack_used       
232b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
232c0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22  e3_busy_timeout"
232d0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
232e0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75  CmdProc*)test_bu
232f0 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d  sy_timeout     }
23300 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66  ,.     { "printf
23310 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
23320 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
23330 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69  mdProc*)test_pri
23340 6e 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ntf           },
23350 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23360 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20  IoTrace",       
23370 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
23380 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61  roc*)test_io_tra
23390 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ce         },.  
233a0 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  };.  static stru
233b0 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
233c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
233d0 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  ObjCmdProc *xPro
233e0 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c  c;.     void *cl
233f0 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f  ientData;.  } aO
23400 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
23410 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e   { "sqlite3_conn
23420 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c  ection_pointer",
23430 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70      get_sqlite_p
23440 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20  ointer, 0 },.   
23450 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
23460 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  d_int",         
23470 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
23480 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  nt,      0 },.  
23490 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
234a0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20  nd_zeroblob",   
234b0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
234c0 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20  zeroblob, 0 },. 
234d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
234e0 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ind_int64",     
234f0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
23500 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a  _int64,    0 },.
23510 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23520 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20  bind_double",   
23530 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
23540 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c  d_double,   0 },
23550 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23560 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20  _bind_null",    
23570 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
23580 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d  nd_null     ,0 }
23590 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
235a0 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20  3_bind_text",   
235b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
235c0 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20  ind_text     ,0 
235d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
235e0 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c  e3_bind_text16",
235f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
23600 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30  bind_text16   ,0
23610 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
23620 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20  te3_bind_blob", 
23630 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23640 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c  _bind_blob     ,
23650 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
23660 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
23670 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73  ter_count",  tes
23680 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
23690 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20  _count, 0},.    
236a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
236b0 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22  _parameter_name"
236c0 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ,   test_bind_pa
236d0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30  rameter_name,  0
236e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
236f0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
23700 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f  r_index",  test_
23710 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
23720 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ndex, 0},.     {
23730 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f   "sqlite3_clear_
23740 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20  bindings",      
23750 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e    test_clear_bin
23760 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20  dings, 0},.     
23770 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  { "sqlite3_sleep
23780 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
23790 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20     test_sleep,  
237a0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
237b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63   { "sqlite3_errc
237c0 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ode",           
237d0 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65      test_errcode
237e0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
237f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
23800 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20  ended_errcode", 
23810 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72       test_ex_err
23820 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20  code    ,0 },.  
23830 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
23840 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20  rmsg",          
23850 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
23860 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g        ,0 },. 
23870 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
23880 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20  rrmsg16",       
23890 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
238a0 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg16      ,0 },.
238b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
238c0 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20  open",          
238d0 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
238e0 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n          ,0 },
238f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23900 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20  _open16",       
23910 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
23920 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d  en16        ,0 }
23930 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
23940 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
23950 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
23960 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
23970 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
23980 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
23990 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
239a0 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
239b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
239c0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
239e0 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
239f0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
23a00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23a10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
23a20 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
23a30 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
23a40 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
23a50 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
23a60 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
23a70 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
23a80 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
23a90 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
23aa0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
23ab0 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
23ac0 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
23ad0 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
23ae0 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
23af0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
23b00 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
23b10 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
23b20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
23b30 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
23b40 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
23b50 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
23b60 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
23b70 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
23b80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
23b90 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
23ba0 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
23bb0 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
23bc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
23bd0 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
23be0 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
23bf0 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
23c00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
23c10 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
23c20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
23c30 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
23c40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23c50 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
23c60 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
23c70 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
23c80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23c90 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
23ca0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
23cb0 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
23cc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
23cd0 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
23ce0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
23cf0 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
23d00 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
23d10 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
23d20 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
23d30 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
23d40 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
23d50 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
23d60 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
23d70 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
23d80 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
23d90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
23da0 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
23db0 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
23dc0 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
23dd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23de0 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
23df0 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
23e00 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
23e10 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
23e20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
23e30 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
23e40 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
23e50 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
23e60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
23e70 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
23e80 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
23e90 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
23ea0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23eb0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
23ec0 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
23ed0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
23ee0 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
23ef0 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
23f00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
23f10 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
23f30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
23f40 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
23f50 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
23f60 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
23f70 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
23f80 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
23f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
23fa0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
23fb0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
23fc0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
23fe0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
23ff0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74    0 },.     { "t
24000 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20  cl_objproc",    
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
24020 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20  unAsObjProc,    
24030 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a     0 },..     /*
24040 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24050 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20  *() API */.     
24060 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
24070 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  n_count",       
24080 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63     test_column_c
24090 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ount  ,0 },.    
240a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61   { "sqlite3_data
240b0 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  _count",        
240c0 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f      test_data_co
240d0 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  unt    ,0 },.   
240e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
240f0 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20  umn_type",      
24100 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
24110 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20  _type   ,0 },.  
24120 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
24130 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20  lumn_blob",     
24140 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
24150 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20  n_blob   ,0 },. 
24160 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
24170 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20  olumn_double",  
24180 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
24190 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a  mn_double ,0 },.
241a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
241b0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20  column_int64",  
241c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
241d0 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c  umn_int64  ,0 },
241e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
241f0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20  _column_text",  
24200 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
24210 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
24220 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a  _column_text },.
24230 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
24240 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20  column_name",   
24250 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20  test_stmt_utf8, 
24260 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
24270 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20  column_name },. 
24280 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
24290 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74  olumn_int",    t
242a0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
242b0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
242c0 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20  olumn_int  },.  
242d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
242e0 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74 65  lumn_bytes",  te
242f0 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28  st_stmt_int,   (
24300 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
24310 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66  lumn_bytes},.#if
24320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24330 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
24340 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
24350 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74 5f  _decltype",test_
24360 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
24370 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
24380 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69  decltype},.#endi
24390 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
243a0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
243b0 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65  TADATA.{ "sqlite
243c0 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
243d0 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
243e0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
243f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
24400 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  abase_name},.{ "
24410 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24420 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  able_name",test_
24430 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
24440 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
24450 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  table_name},.{ "
24460 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
24470 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74  rigin_name",test
24480 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
24490 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
244a0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23  _origin_name},.#
244b0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
244c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
244d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
244e0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22  _column_bytes16"
244f0 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c  , test_stmt_int,
24500 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
24510 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d  column_bytes16 }
24520 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
24530 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22  3_column_text16"
24540 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ,  test_stmt_utf
24550 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
24560 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
24570 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
24580 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
24590 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
245a0 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
245b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
245c0 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  6},.     { "add_
245d0 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
245e0 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f  ollations", add_
245f0 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
24600 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20  ollations, 0    
24610 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
24620 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
24630 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
24640 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
24650 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  e16",test_stmt_u
24660 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69  tf16,(void*)sqli
24670 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
24680 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ype16},.#endif.#
24690 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
246a0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
246b0 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  ATA.{"sqlite3_co
246c0 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
246d0 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74  me16",.  test_st
246e0 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
246f0 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
24700 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c  e_name16},.{"sql
24710 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
24720 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  e_name16", test_
24730 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
24740 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
24750 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c  n_table_name16},
24760 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
24770 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22  n_origin_name16"
24780 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
24790 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
247a0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
247b0 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  name16},.#endif.
247c0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
247d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
247e0 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  llation_v2", tes
247f0 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
24800 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
24810 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62   { "sqlite3_glob
24820 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20  al_recover",    
24830 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
24840 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20  over, 0   },.   
24850 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62    { "working_64b
24860 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  it_int",        
24870 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
24880 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  int,   0   },.  
24890 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b     { "vfs_unlink
248a0 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
248b0 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
248c0 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
248d0 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66      { "vfs_initf
248e0 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ail_test",      
248f0 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c      vfs_initfail
24900 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
24910 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65       { "vfs_unre
24920 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
24930 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73       vfs_unregis
24940 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
24950 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72  .     { "vfs_rer
24960 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
24970 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69        vfs_reregi
24980 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
24990 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
249a0 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20  ontrol_test",   
249b0 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
249c0 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  rol_test,   0   
249d0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
249e0 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
249f0 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  o_test", file_co
24a00 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
24a10 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
24a20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
24a30 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
24a40 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
24a50 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c  _lockproxy_test,
24a60 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
24a70 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73  "sqlite3_vfs_lis
24a80 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66  t",           vf
24a90 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20  s_list,     0   
24aa0 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
24ab0 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
24ac0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24ad0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
24ae0 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
24af0 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74  llate",        t
24b00 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  est_collate, 0  
24b10 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24b20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
24b30 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74  llate_needed", t
24b40 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
24b50 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20  ed, 0     },.   
24b60 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75    { "add_test_fu
24b70 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74  nction",       t
24b80 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20  est_function, 0 
24b90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
24ba0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
24bb0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
24bc0 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
24bd0 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
24be0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
24bf0 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
24c00 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
24c10 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
24c20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
24c30 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
24c40 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ACHE.     { "sql
24c50 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
24c60 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f  ed_cache", test_
24c70 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30  enable_shared, 0
24c80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
24c90 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
24ca0 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74  e_report", sqlit
24cb0 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
24cc0 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65  heReport, 0},.#e
24cd0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
24ce0 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
24cf0 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69  number", test_li
24d00 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c  bversion_number,
24d10 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
24d20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
24d30 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
24d40 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c   { "sqlite3_tabl
24d50 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
24d60 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  a", test_table_c
24d70 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20  olumn_metadata, 
24d80 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  0  },.#endif.#if
24d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24da0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b  _INCRBLOB.     {
24db0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
24dc0 65 61 64 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62  ead",  test_blob
24dd0 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20  _read, 0  },.   
24de0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
24df0 62 5f 77 72 69 74 65 22 2c 20 74 65 73 74 5f 62  b_write", test_b
24e00 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c  lob_write, 0  },
24e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
24e20 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20  pcache_stats",  
24e30 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65       test_pcache
24e40 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69  _stats, 0  },.#i
24e50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
24e60 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
24e70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
24e80 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  _unlock_notify",
24e90 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
24ea0 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ify, 0  },.#endi
24eb0 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
24ec0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
24ed0 22 2c 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  ", test_wal_chec
24ee0 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
24ef0 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  };.  static int 
24f00 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73  bitmask_size = s
24f10 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
24f20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74  ;.  int i;.  ext
24f30 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24f40 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69  sync_count, sqli
24f50 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
24f60 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
24f70 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
24f80 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  p_count;.  exter
24f90 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  n int sqlite3_li
24fa0 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ke_count;.  exte
24fb0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78  rn int sqlite3_x
24fc0 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  feropt_count;.  
24fd0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24fe0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
24ff0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
25000 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
25010 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b  r_writedb_count;
25020 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
25030 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
25040 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51  ej_count;.#if SQ
25050 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78  LITE_OS_WIN.  ex
25060 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
25070 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66  _os_type;.#endif
25080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25090 45 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e  EBUG.  extern in
250a0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  t sqlite3WhereTr
250b0 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ace;.  extern in
250c0 74 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65  t sqlite3OSTrace
250d0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
250e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
250f0 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
25100 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61  nt sqlite3WalTra
25110 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ce;.#endif.#ifde
25120 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
25130 65 78 74 65 72 6e 20 63 68 61 72 20 73 71 6c 69  extern char sqli
25140 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  te3_query_plan[]
25150 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
25160 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71  *query_plan = sq
25170 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
25180 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
25190 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78  ENABLE_FTS3.  ex
251a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
251b0 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
251c0 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66  entheses;.#endif
251d0 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69  .#endif..  for(i
251e0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d  =0; i<sizeof(aCm
251f0 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30  d)/sizeof(aCmd[0
25200 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
25210 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
25220 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e  interp, aCmd[i].
25230 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78  zName, aCmd[i].x
25240 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
25250 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
25260 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
25270 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
25280 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
25290 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
252a0 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
252b0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
252c0 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
252d0 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
252e0 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
252f0 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  .  }.  Tcl_LinkV
25300 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
25310 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22  te_search_count"
25320 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
25330 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f  &sqlite3_search_
25340 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
25350 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
25360 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
25370 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22  ite_found_count"
25380 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
25390 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63  &sqlite3_found_c
253a0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
253b0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
253c0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
253d0 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20  te_sort_count", 
253e0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
253f0 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
25400 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
25410 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
25420 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
25430 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20  _max_blobsize", 
25440 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25450 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
25460 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
25470 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
25480 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
25490 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a  e_like_count", .
254a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
254b0 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
254c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
254d0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
254e0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
254f0 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
25500 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
25510 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
25520 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
25530 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
25540 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
25550 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
25560 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
25570 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
25580 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
25590 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
255a0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
255b0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
255c0 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
255d0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
255e0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
255f0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
25600 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
25610 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
25620 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
25630 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25640 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69  G_STYLE.  Tcl_Li
25650 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
25660 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d  qlite_hostid_num
25670 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
25680 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )&sqlite3_hostid
25690 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  _num, TCL_LINK_I
256a0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
256b0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
256c0 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
256d0 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
256e0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
256f0 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
25700 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
25710 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
25720 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
25730 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
25740 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
25750 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
25760 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
25770 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
25780 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
25790 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
257a0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
257b0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
257c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
257d0 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
257e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
257f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
25800 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
25810 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
25820 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25830 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
25840 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
25850 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
25860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
25870 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
25880 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e  interp, "unalign
25890 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
258a0 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  r",.      (char*
258b0 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  )&unaligned_stri
258c0 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f  ng_counter, TCL_
258d0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
258e0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
258f0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
25900 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
25910 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e  , "sqlite_last_n
25920 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22  eeded_collation"
25930 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
25940 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f  pzNeededCollatio
25950 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
25960 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
25970 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
25980 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25990 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
259a0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
259b0 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28  s_type",.      (
259c0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
259d0 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b  s_type, TCL_LINK
259e0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
259f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
25a00 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
25a10 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71  nterp, "sqlite_q
25a20 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20  uery_plan",.    
25a30 20 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f    (char*)&query_
25a40 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  plan, TCL_LINK_S
25a50 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  TRING|TCL_LINK_R
25a60 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  EAD_ONLY);.#endi
25a70 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
25a80 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b  DEBUG.  Tcl_Link
25a90 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
25aa0 69 74 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22  ite_addop_trace"
25ab0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
25ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
25ad0 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  Trace, TCL_LINK_
25ae0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
25af0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
25b00 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22  ite_where_trace"
25b10 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
25b20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
25b30 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
25b40 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
25b50 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
25b60 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  os_trace",.     
25b70 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
25b80 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  OSTrace, TCL_LIN
25b90 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
25ba0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
25bb0 71 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22  qlite_wal_trace"
25bc0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
25bd0 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c  sqlite3WalTrace,
25be0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
25bf0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
25c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
25c10 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  O.  Tcl_LinkVar(
25c20 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
25c30 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c  opentemp_count",
25c40 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25c50 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
25c60 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
25c70 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  INT);.#endif.  T
25c80 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25c90 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  p, "sqlite_stati
25ca0 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20  c_bind_value",. 
25cb0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25cc0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
25cd0 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  value, TCL_LINK_
25ce0 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
25cf0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
25d00 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
25d10 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20  nd_nbyte",.     
25d20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
25d30 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
25d40 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
25d50 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
25d60 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
25d70 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c  temp_directory",
25d80 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25d90 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
25da0 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ctory, TCL_LINK_
25db0 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
25dc0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
25dd0 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20  bitmask_size",. 
25de0 20 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74       (char*)&bit
25df0 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c  mask_size, TCL_L
25e00 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b  INK_INT|TCL_LINK
25e10 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54  _READ_ONLY);.  T
25e20 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25e30 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f  p, "sqlite_sync_
25e40 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
25e50 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79  har*)&sqlite3_sy
25e60 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nc_count, TCL_LI
25e70 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
25e80 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
25e90 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f  sqlite_fullsync_
25ea0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
25eb0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75  har*)&sqlite3_fu
25ec0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43  llsync_count, TC
25ed0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
25ee0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
25ef0 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20  ENABLE_FTS3) && 
25f00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
25f10 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  EST).  Tcl_LinkV
25f20 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
25f30 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  te_fts3_enable_p
25f40 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20  arentheses",.   
25f50 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
25f60 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  e3_fts3_enable_p
25f70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f  arentheses, TCL_
25f80 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
25f90 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
25fa0 4b 3b 0a 7d 0a                                   K;.}.