/ Hex Artifact Content
Login

Artifact b2df6d7ed8ecb53680f7040163ba92b50c471ed8104d128c88c8e969a107887f:


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 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f080: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f090: 52 45 50 52 45 50 41 52 45 22 2c 20 20 20 20 20  REPREPARE",     
f0a0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f0b0: 54 55 53 5f 52 45 50 52 45 50 41 52 45 20 20 20  TUS_REPREPARE   
f0c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f0d0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f0e0: 52 55 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  RUN",           
f0f0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f100: 54 55 53 5f 52 55 4e 20 20 20 20 20 20 20 20 20  TUS_RUN         
f110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f120: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f130: 4d 45 4d 55 53 45 44 22 2c 20 20 20 20 20 20 20  MEMUSED",       
f140: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f150: 54 55 53 5f 4d 45 4d 55 53 45 44 20 20 20 20 20  TUS_MEMUSED     
f160: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f170: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f180: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f190: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f1a0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f1b0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f1c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f1d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f1e0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f1f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f200: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f210: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f230: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f260: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f270: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f280: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f290: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f2a0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f2b0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f2d0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f2e0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f2f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f300: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f310: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f330: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f340: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f350: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f360: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f380: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f390: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f3a0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f3b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f3d0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f3e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f3f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f410: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f420: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f430: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f440: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f450: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f460: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f470: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f480: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f490: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f4a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f4b0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f4c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f4d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f4e0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f4f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f500: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f530: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f550: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f560: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f570: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f580: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f590: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f5a0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f5b0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f5c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f5d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f5e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f5f0: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f610: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f620: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f630: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f640: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f650: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f660: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f670: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f680: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f690: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f6a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f6c0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f6d0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f6e0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f6f0: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f700: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f710: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f720: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f750: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f760: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f770: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f780: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f790: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f7a0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f7b0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f7c0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7d0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f7e0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f7f0: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f800: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f840: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f850: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f860: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f870: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f880: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f8a0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f8b0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8c0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f8d0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f8e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f8f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f900: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f910: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f920: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f950: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f970: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f980: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f990: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f9a0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f9b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f9c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f9d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f9e0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f9f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
fa00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fa10: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fa20: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
fa30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
fa40: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fa50: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fa60: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fa70: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
fa80: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
fa90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
faa0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fac0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
fad0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
fae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
faf0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fb00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fb10: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fb20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fb30: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fb50: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fb60: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fb70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fb80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
fb90: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fba0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fbb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fbc0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fbd0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fbe0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fbf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fc00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fc10: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fc20: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fc30: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fc40: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fc60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fc70: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fc80: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fca0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fcd0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fce0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fcf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fd00: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fd10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fd20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fd30: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fd40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fd50: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fd60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fd70: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fd80: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fd90: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fda0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fdb0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fdc0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fde0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fdf0: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fe00: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fe10: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fe20: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fe30: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fe40: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fe50: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fe60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fe70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fe80: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fe90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fea0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
feb0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fec0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fed0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fee0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fef0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
ff00: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73  sqlite3_config_s
ff10: 6f 72 74 65 72 72 65 66 0a 2a 2a 0a 2a 2a 20 53  orterref.**.** S
ff20: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f  et the SQLITE_CO
ff30: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
ff40: 49 5a 45 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  IZE configuratio
ff50: 6e 20 6f 70 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  n option.*/.stat
ff60: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
ff70: 4c 41 50 49 20 74 65 73 74 5f 63 6f 6e 66 69 67  LAPI test_config
ff80: 5f 73 6f 72 74 65 72 72 65 66 28 0a 20 20 76 6f  _sorterref(.  vo
ff90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ffa0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ffb0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
ffc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ffd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ffe0: 69 6e 74 20 69 56 61 6c 3b 0a 20 20 69 66 28 20  int iVal;.  if( 
fff0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10000 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10010 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10020 20 22 4e 42 59 54 45 22 29 3b 0a 20 20 20 20 72   "NBYTE");.    r
10030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10040 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
10050 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
10060 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69  erp, objv[1], &i
10070 56 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  Val) ) return TC
10080 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
10090 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
100a0 5f 43 4f 4e 46 49 47 5f 53 4f 52 54 45 52 52 45  _CONFIG_SORTERRE
100b0 46 5f 53 49 5a 45 2c 20 69 56 61 6c 29 3b 0a 20  F_SIZE, iVal);. 
100c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
100d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
100e0 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  vfs_current_time
100f0 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74  _int64.**.** Ret
10100 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  urn the value re
10110 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65  turned by the de
10120 66 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72  fault VFS's xCur
10130 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65  rentTimeInt64 me
10140 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
10150 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
10160 49 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65  I vfsCurrentTime
10170 49 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  Int64(.  void * 
10180 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10190 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
101a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
101b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
101c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74  bjv[].){.  i64 t
101d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
101e0 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
101f0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
10200 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
10210 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10220 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10230 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
10240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10250 20 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72   }.  pVfs->xCurr
10260 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
10270 73 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65  s, &t);.  Tcl_Se
10280 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10290 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
102a0 74 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75  tObj(t));.  retu
102b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
102c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
102d0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
102e0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
102f0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42  _snapshot_get DB
10300 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69   DBNAME.*/.stati
10310 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
10320 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  API test_snapsho
10330 74 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_get(.  void * 
10340 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10350 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10360 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10370 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10380 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
10390 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
103a0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
103b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
103c0 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d  hot *pSnapshot =
103d0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
103e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
103f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10400 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
10410 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
10420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10430 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
10440 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10460 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10480 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
10490 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
104a0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
104b0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64  3_snapshot_get(d
104c0 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70  b, zName, &pSnap
104d0 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21  shot);.  if( rc!
104e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
104f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10500 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10510 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
10520 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
10530 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  -1));.    return
10540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
10550 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
10560 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28  uf[100];.    if(
10570 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
10580 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
10590 70 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68  p, zBuf, pSnapsh
105a0 6f 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ot) ) return TCL
105b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
105c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
105d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
105e0 6e 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29  ngObj(zBuf, -1))
105f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10600 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10610 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10620 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10630 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10640 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10650 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10660 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65  _snapshot_recove
10670 72 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  r DB DBNAME.*/.s
10680 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10690 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
106a0 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20  pshot_recover(. 
106b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
106c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
106d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
106e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
106f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10700 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10710 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
10720 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20   *zName;..  if( 
10730 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10740 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10750 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10760 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20   "DB DBNAME");. 
10770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10780 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10790 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
107a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
107b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
107c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
107d0 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  ROR;.  zName = T
107e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
107f0 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[2]);..  rc = s
10800 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
10810 72 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d  recover(db, zNam
10820 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
10830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
10840 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10850 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10860 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
10870 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
10880 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10890 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
108a0 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
108b0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
108c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
108d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
108e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
108f0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
10900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10910 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10920 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10930 61 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44  apshot_open DB D
10940 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a  BNAME SNAPSHOT.*
10950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
10960 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
10970 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
10980 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10990 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
109a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
109b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
109c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
109d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
109e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
109f0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
10a00 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e  e3_snapshot *pSn
10a10 61 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f  apshot;..  if( o
10a20 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
10a30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10a40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10a50 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
10a60 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
10a70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10a80 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
10a90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10aa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10ab0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
10ac0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
10ad0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
10ae0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
10af0 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71   pSnapshot = (sq
10b00 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29  lite3_snapshot*)
10b10 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
10b20 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69  oPtr(Tcl_GetStri
10b30 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20  ng(objv[3]));.. 
10b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e   rc = sqlite3_sn
10b50 61 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20  apshot_open(db, 
10b60 7a 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74  zName, pSnapshot
10b70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10b90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10ba0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10bb0 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
10bc0 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
10bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10be0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
10bf0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
10c00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10c10 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
10c20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10c30 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10c40 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  T./*.** Usage: s
10c50 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
10c60 66 72 65 65 20 53 4e 41 50 53 48 4f 54 0a 2a 2f  free SNAPSHOT.*/
10c70 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10c80 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
10c90 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20  napshot_free(.  
10ca0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10cb0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10cc0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10cd0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10ce0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10cf0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
10d00 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20  ot *pSnapshot;. 
10d10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10d20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10d30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10d40 6f 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22  objv, "SNAPSHOT"
10d50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10d60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
10d70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69  Snapshot = (sqli
10d80 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71  te3_snapshot*)sq
10d90 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
10da0 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  tr(Tcl_GetString
10db0 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71  (objv[1]));.  sq
10dc0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
10dd0 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a  ree(pSnapshot);.
10de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10df0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10e00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
10e10 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  HOT */..#ifdef S
10e20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10e30 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67  PSHOT./*.** Usag
10e40 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  e: sqlite3_snaps
10e50 68 6f 74 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54  hot_cmp SNAPSHOT
10e60 31 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73  1 SNAPSHOT2.*/.s
10e70 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10e80 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
10e90 70 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69  pshot_cmp(.  voi
10ea0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10eb0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10ec0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10ed0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10ee0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
10ef0 6e 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65  nt res;.  sqlite
10f00 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a  3_snapshot *p1;.
10f10 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
10f20 6f 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62  ot *p2;.  if( ob
10f30 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
10f40 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10f50 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10f60 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48  SNAPSHOT1 SNAPSH
10f70 4f 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OT2");.    retur
10f80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10f90 0a 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33  .  p1 = (sqlite3
10fa0 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74  _snapshot*)sqlit
10fb0 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
10fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10fd0 6a 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20  jv[1]));.  p2 = 
10fe0 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
10ff0 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  t*)sqlite3TestTe
11000 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53  xtToPtr(Tcl_GetS
11010 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b  tring(objv[2]));
11020 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
11030 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31  _snapshot_cmp(p1
11040 2c 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , p2);.  Tcl_Set
11050 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11060 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
11070 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
11080 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
11090 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
110a0 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
110b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
110c0 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
110d0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
110e0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62  3_snapshot_get_b
110f0 6c 6f 62 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f  lob DB DBNAME.*/
11100 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
11110 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
11120 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62  napshot_get_blob
11130 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11140 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11150 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11160 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11170 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11180 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
11190 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
111a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
111b0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
111c0 70 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a  pSnapshot = 0;..
111d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
111e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
111f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
11200 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
11210 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
11220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11230 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
11240 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
11250 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11260 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
11270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61  TCL_ERROR;.  zNa
11280 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
11290 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20  ng(objv[2]);..  
112a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
112b0 70 73 68 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e  pshot_get(db, zN
112c0 61 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f 74 29  ame, &pSnapshot)
112d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
112e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
112f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
11300 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
11310 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
11320 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
11330 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11340 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
11350 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
11360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
11370 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 42 79 74        Tcl_NewByt
11380 65 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67  eArrayObj((unsig
11390 6e 65 64 20 63 68 61 72 2a 29 70 53 6e 61 70 73  ned char*)pSnaps
113a0 68 6f 74 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  hot, sizeof(sqli
113b0 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 29 0a 20  te3_snapshot)). 
113c0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
113d0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28  3_snapshot_free(
113e0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 7d 0a  pSnapshot);.  }.
113f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11400 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11410 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
11420 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  HOT */..#ifdef S
11430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
11440 50 53 48 4f 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20  PSHOT.  /*.  ** 
11450 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
11460 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f  napshot_open_blo
11470 62 20 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50  b DB DBNAME SNAP
11480 53 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  SHOT.*/.static i
11490 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
114a0 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f   test_snapshot_o
114b0 70 65 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  pen_blob(.  void
114c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
114d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
114e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
114f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11500 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
11510 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
11520 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  *db;.  char *zNa
11530 6d 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  me;.  unsigned c
11540 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  har *pBlob;.  in
11550 74 20 6e 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20  t nBlob;..  if( 
11560 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
11570 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11580 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11590 20 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50   "DB DBNAME SNAP
115a0 53 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75  SHOT");.    retu
115b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
115c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
115d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
115e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
115f0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
11600 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11610 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
11620 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
11630 20 20 70 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65    pBlob = Tcl_Ge
11640 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
11650 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 6c 6f  j(objv[3], &nBlo
11660 62 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 21  b);.  if( nBlob!
11670 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  =sizeof(sqlite3_
11680 73 6e 61 70 73 68 6f 74 29 20 29 7b 0a 20 20 20  snapshot) ){.   
11690 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
116a0 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53  t(interp, "bad S
116b0 4e 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20  NAPSHOT", 0);.  
116c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
116d0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
116e0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
116f0 6f 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  open(db, zName, 
11700 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
11710 74 2a 29 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  t*)pBlob);.  if(
11720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11730 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
11740 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11750 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11760 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
11770 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65  c), -1));.    re
11780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
117a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
117b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
117c0 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64  NAPSHOT */..#ifd
117d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
117e0 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20  _SNAPSHOT./*.** 
117f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
11800 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62  napshot_cmp_blob
11810 20 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53   SNAPSHOT1 SNAPS
11820 48 4f 54 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69  HOT2.*/.static i
11830 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
11840 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63   test_snapshot_c
11850 6d 70 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mp_blob(.  void 
11860 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11870 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11880 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11890 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
118a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
118b0 20 72 65 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64   res;.  unsigned
118c0 20 63 68 61 72 20 2a 70 31 3b 0a 20 20 75 6e 73   char *p1;.  uns
118d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 32 3b 0a  igned char *p2;.
118e0 20 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20    int n1;.  int 
118f0 6e 32 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  n2;..  if( objc!
11900 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
11910 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11920 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41  p, 1, objv, "SNA
11930 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32  PSHOT1 SNAPSHOT2
11940 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
11950 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
11960 20 70 31 20 3d 20 54 63 6c 5f 47 65 74 42 79 74   p1 = Tcl_GetByt
11970 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
11980 6a 76 5b 31 5d 2c 20 26 6e 31 29 3b 0a 20 20 70  jv[1], &n1);.  p
11990 32 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  2 = Tcl_GetByteA
119a0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
119b0 5b 32 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 69 66  [2], &n2);..  if
119c0 28 20 6e 31 21 3d 73 69 7a 65 6f 66 28 73 71 6c  ( n1!=sizeof(sql
119d0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 7c  ite3_snapshot) |
119e0 7c 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20  | n1!=n2 ){.    
119f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11a00 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e  (interp, "bad SN
11a10 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20  APSHOT", 0);.   
11a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11a30 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 20 3d 20  R;.  }..  res = 
11a40 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11a50 5f 63 6d 70 28 28 73 71 6c 69 74 65 33 5f 73 6e  _cmp((sqlite3_sn
11a60 61 70 73 68 6f 74 2a 29 70 31 2c 20 28 73 71 6c  apshot*)p1, (sql
11a70 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70  ite3_snapshot*)p
11a80 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  2);.  Tcl_SetObj
11a90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11aa0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
11ab0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
11ac0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
11ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11ae0 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a  NAPSHOT */../*.*
11af0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
11b00 5f 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65  _delete_database
11b10 20 46 49 4c 45 4e 41 4d 45 0a 2a 2f 0a 69 6e 74   FILENAME.*/.int
11b20 20 73 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f   sqlite3_delete_
11b30 64 61 74 61 62 61 73 65 28 63 6f 6e 73 74 20 63  database(const c
11b40 68 61 72 2a 29 3b 20 20 20 2f 2a 20 69 6e 20 74  har*);   /* in t
11b50 65 73 74 5f 64 65 6c 65 74 65 2e 63 20 2a 2f 0a  est_delete.c */.
11b60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
11b70 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 65  E_TCLAPI test_de
11b80 6c 65 74 65 5f 64 61 74 61 62 61 73 65 28 0a 20  lete_database(. 
11b90 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11ba0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11bb0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11bc0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11bd0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11be0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
11bf0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
11c00 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11c10 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
11c20 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
11c30 20 6f 62 6a 76 2c 20 22 46 49 4c 45 22 29 3b 0a   objv, "FILE");.
11c40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11c50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  RROR;.  }.  zFil
11c60 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
11c70 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  )Tcl_GetString(o
11c80 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20  bjv[1]);.  rc = 
11c90 73 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64  sqlite3_delete_d
11ca0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 29 3b 0a  atabase(zFile);.
11cb0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
11cc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11cd0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
11ce0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
11cf0 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   -1));.  return 
11d00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
11d10 20 55 73 61 67 65 3a 20 61 74 6f 6d 69 63 5f 62   Usage: atomic_b
11d20 61 74 63 68 5f 77 72 69 74 65 20 50 41 54 48 0a  atch_write PATH.
11d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
11d40 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
11d50 5f 61 74 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72  _atomic_batch_wr
11d60 69 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ite(.  void * cl
11d70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11d80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11d90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11da0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11db0 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  v[].){.  char *z
11dc0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
11dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
11de0 20 74 6f 20 66 69 6c 65 20 74 6f 20 74 65 73 74   to file to test
11df0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
11e00 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
11e10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11e20 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
11e30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 20  lite3_file *pFd 
11e40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
11e50 20 53 51 4c 69 74 65 20 66 64 20 6f 70 65 6e 20   SQLite fd open 
11e60 6f 6e 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 69 6e  on zFile */.  in
11e70 74 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t bRes = 0;     
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e90 20 49 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   Integer result 
11ea0 6f 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  of this command 
11eb0 2a 2f 0a 20 20 69 6e 74 20 64 63 20 3d 20 30 3b  */.  int dc = 0;
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 2d 63       /* Device-c
11ee0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6d  haracteristics m
11ef0 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ask */.  int rc;
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
11f20 74 65 33 5f 6f 70 65 6e 28 29 20 72 65 74 75 72  te3_open() retur
11f30 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
11f40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
11f50 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11f60 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11f70 2c 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72  , "PATH");.    r
11f80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11f90 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 54  .  }.  zFile = T
11fa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11fb0 76 5b 31 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[1]);..  rc = s
11fc0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
11fd0 65 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72  e, &db);.  if( r
11fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11ff0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12000 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
12010 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
12020 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12030 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
12040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12050 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
12060 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
12070 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  ol(db, "main", S
12080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
12090 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 2a  _POINTER, (void*
120a0 29 26 70 46 64 29 3b 0a 20 20 64 63 20 3d 20 70  )&pFd);.  dc = p
120b0 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44  Fd->pMethods->xD
120c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
120d0 74 69 63 73 28 70 46 64 29 3b 0a 20 20 69 66 28  tics(pFd);.  if(
120e0 20 64 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43   dc & SQLITE_IOC
120f0 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
12100 29 7b 0a 20 20 20 20 62 52 65 73 20 3d 20 31 3b  ){.    bRes = 1;
12110 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  .  }..  Tcl_SetO
12120 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12130 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62   Tcl_NewIntObj(b
12140 52 65 73 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Res));.  sqlite3
12150 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65  _close(db);.  re
12160 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12170 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
12180 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20  lite3_next_stmt 
12190 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20   DB  STMT.**.** 
121a0 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
121b0 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75  statment in sequ
121c0 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e  ence after STMT.
121d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
121e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
121f0 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76  t_next_stmt(.  v
12200 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12210 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12220 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12230 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12240 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12250 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12260 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  Stmt;.  sqlite3 
12270 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  *db = 0;.  char 
12280 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[50];..  if(
12290 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
122a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
122b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
122c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
122d0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
122e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
122f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12300 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b   " DB STMT", 0);
12310 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12320 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
12330 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
12340 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12350 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12360 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
12370 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
12380 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
12390 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
123a0 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
123b0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
123c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74  L_ERROR;.  pStmt
123d0 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f   = sqlite3_next_
123e0 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b  stmt(db, pStmt);
123f0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
12400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
12410 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12420 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
12430 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
12440 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
12450 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12460 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
12470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
12480 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
12490 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
124a0 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53  stmt_readonly  S
124b0 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
124c0 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73   true if STMT is
124d0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
124e0 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
124f0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
12500 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
12510 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64  d to leave the d
12520 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69  atabase unmodifi
12530 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12540 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
12550 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  test_stmt_readon
12560 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ly(.  void * cli
12570 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
12580 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
12590 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
125a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
125b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
125c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
125d0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
125e0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
125f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12600 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
12610 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
12620 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
12630 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12640 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
12650 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
12660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12670 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
12680 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12690 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
126a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
126b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
126c0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
126d0 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
126e0 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  nly(pStmt);.  Tc
126f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12700 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
12710 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20  oleanObj(rc));. 
12720 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12730 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
12740 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
12750 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  sy  STMT.**.** R
12760 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54  eturn true if ST
12770 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  MT is a non-NULL
12780 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
12790 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  atement.** that 
127a0 68 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64  has been stepped
127b0 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70   but not to comp
127c0 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  letion..*/.stati
127d0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
127e0 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 62 75  API test_stmt_bu
127f0 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sy(.  void * cli
12800 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
12810 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
12820 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
12830 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
12840 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
12850 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
12860 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
12870 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
12880 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12890 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
128a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
128b0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
128c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
128d0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
128e0 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
128f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12900 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
12910 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12920 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12930 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
12940 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
12950 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
12960 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
12970 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
12980 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12990 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
129a0 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  nObj(rc));.  ret
129b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
129c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73 65  *.** Usage:  use
129d0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20  s_stmt_journal  
129e0 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
129f0 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 75  n true if STMT u
12a00 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ses a statement 
12a10 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
12a20 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
12a30 4c 41 50 49 20 75 73 65 73 5f 73 74 6d 74 5f 6a  LAPI uses_stmt_j
12a40 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a  ournal(.  void *
12a50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12a60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12a70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12a80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12a90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
12aa0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
12ab0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
12ac0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12ad0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12ae0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
12af0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
12b00 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
12b10 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12b20 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
12b30 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12b50 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12b60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12b70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12b80 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12b90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12ba0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  .  sqlite3_stmt_
12bb0 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b  readonly(pStmt);
12bc0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
12bd0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
12be0 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28  NewBooleanObj(((
12bf0 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75  Vdbe *)pStmt)->u
12c00 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29  sesStmtJournal))
12c10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12c20 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
12c30 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ge:  sqlite3_res
12c40 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  et  STMT .**.** 
12c50 52 65 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e  Reset a statemen
12c60 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
12c70 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
12c80 43 4c 41 50 49 20 74 65 73 74 5f 72 65 73 65 74  CLAPI test_reset
12c90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12ca0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12cb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12cc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12cd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12ce0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
12cf0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
12d00 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
12d10 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
12d20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12d30 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12d40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12d50 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
12d60 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12d70 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
12d80 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
12d90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12da0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
12db0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12dc0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12dd0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
12de0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
12df0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
12e00 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
12e10 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
12e20 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
12e30 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
12e40 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
12e50 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
12e60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12e70 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
12e80 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
12e90 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
12ea0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
12eb0 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
12ec0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12ed0 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
12ee0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
12ef0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
12f00 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
12f10 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
12f20 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
12f30 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
12f40 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
12f50 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
12f60 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
12f70 4c 41 50 49 20 74 65 73 74 5f 65 78 70 69 72 65  LAPI test_expire
12f80 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
12f90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12fa0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12fb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12fc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12fd0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
12fe0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
12ff0 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  TED.  sqlite3_st
13000 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28  mt *pStmt;.  if(
13010 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
13020 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13030 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
13040 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
13050 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
13060 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
13070 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
13080 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
13090 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
130a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
130b0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
130c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
130d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
130e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
130f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
13100 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
13110 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
13120 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f  leanObj(sqlite3_
13130 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29  expired(pStmt)))
13140 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
13150 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13160 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
13170 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  e3_transfer_bind
13180 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f  ings FROMSTMT TO
13190 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  STMT.**.** Trans
131a0 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73  fer all bindings
131b0 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f   from FROMSTMT o
131c0 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f  ver to TOSTMT.*/
131d0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
131e0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
131f0 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20  ransfer_bind(.  
13200 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13210 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13220 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13230 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13240 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13260 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
13270 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13280 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a  Stmt1, *pStmt2;.
13290 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
132a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
132b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
132c0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
132d0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
132e0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
132f0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
13300 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d  , 0), " FROM-STM
13310 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a  T TO-STMT", 0);.
13320 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13330 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
13340 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
13350 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
13360 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
13370 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20  pStmt1)) return 
13380 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
13390 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
133a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
133b0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
133c0 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e  &pStmt2)) return
133d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
133e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
133f0 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
13400 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
13410 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  e3_transfer_bind
13420 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d  ings(pStmt1,pStm
13430 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t2)));.#endif.  
13440 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
13450 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
13460 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20  sqlite3_changes 
13470 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
13480 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
13490 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
134a0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
134b0 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78  e last SQL.** ex
134c0 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ecution..*/.stat
134d0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
134e0 4c 41 50 49 20 74 65 73 74 5f 63 68 61 6e 67 65  LAPI test_change
134f0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
13500 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
13510 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13520 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13530 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13540 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
13550 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
13560 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
13570 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13580 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13590 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
135a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
135b0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
135c0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
135d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
135e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
135f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13600 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13610 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
13620 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13630 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13640 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
13650 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
13660 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
13670 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
13690 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
136a0 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
136b0 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
136c0 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
136d0 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
136e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
136f0 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
13700 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
13710 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
13720 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ue = 0;.static i
13730 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  nt sqlite_static
13740 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b  _bind_nbyte = 0;
13750 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
13760 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d  sqlite3_bind  VM
13770 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c    IDX  VALUE  FL
13780 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74  AGS.**.** Sets t
13790 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
137a0 49 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63  IDX-th occurrenc
137b0 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20  e of "?" in the 
137c0 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20  original SQL.** 
137d0 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69  string.  VALUE i
137e0 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e  s the new value.
137f0 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c    If FLAGS=="nul
13800 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73  l" then VALUE is
13810 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20  .** ignored and 
13820 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
13830 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c   to NULL.  If FL
13840 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68  AGS=="static" th
13850 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
13860 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
13870 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20  lue of a static 
13880 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a  variable named.*
13890 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  * "sqlite_static
138a0 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49  _bind_value".  I
138b0 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c  f FLAGS=="normal
138c0 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a  " then a copy.**
138d0 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73   of the VALUE is
138e0 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53   made.  If FLAGS
138f0 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20  =="blob10" then 
13900 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72  a VALUE is ignor
13910 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79  ed.** an a 10-by
13920 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30  te blob "abc\000
13930 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e  xyz\000pq" is in
13940 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  serted..*/.stati
13950 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
13960 41 50 49 20 74 65 73 74 5f 62 69 6e 64 28 0a 20  API test_bind(. 
13970 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
13980 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13990 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
139a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
139b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
139c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
139d0 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
139e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
139f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
13a00 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
13a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
13a20 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
13a30 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
13a40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
13a50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
13a60 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  dx;.  if( argc!=
13a70 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
13a80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13a90 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13aa0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
13ab0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
13ac0 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20   " VM IDX VALUE 
13ad0 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72  (null|static|nor
13ae0 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20  mal)\"", 0);.   
13af0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13b00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
13b10 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
13b20 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53  rp, argv[1], &pS
13b30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
13b40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
13b50 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
13b60 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29  , argv[2], &idx)
13b70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13b80 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
13b90 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22  p(argv[4],"null"
13ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
13bb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
13bc0 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
13bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13be0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
13bf0 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ic")==0 ){.    r
13c00 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
13c10 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
13c20 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
13c30 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20  bind_value, -1, 
13c40 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
13c50 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
13c60 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d  static-nbytes")=
13c70 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
13c80 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13c90 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
13ca0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
13cb0 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13ce0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
13cf0 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65  _nbyte, 0);.  }e
13d00 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
13d10 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29  rgv[4],"normal")
13d20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
13d30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
13d40 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72  t(pStmt, idx, ar
13d50 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[3], -1, SQLIT
13d60 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
13d70 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13d80 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30  (argv[4],"blob10
13d90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
13da0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
13db0 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
13dc0 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
13dd0 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53  q", 10, SQLITE_S
13de0 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
13df0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
13e00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34  esult(interp, "4
13e10 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  th argument shou
13e20 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
13e30 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73  "\"null\" or \"s
13e40 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72  tatic\" or \"nor
13e50 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  mal\"", 0);.    
13e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
13e80 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
13e90 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
13ea0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
13eb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13ec0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13ed0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
13ee0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13ef0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
13f00 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
13f10 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
13f20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13f30 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
13f40 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
13f50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13f60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
13f70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
13f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f90 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73  T_UTF16./*.** Us
13fa0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
13fb0 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c  llate <db ptr> <
13fc0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
13fd0 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
13fe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13ff0 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
14000 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
14010 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  s the correct co
14020 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
14030 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  nce callback whe
14040 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
14050 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
14060 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
14070 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
14080 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
14090 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
140a0 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f  registers the co
140b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
140c0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a   "test_collate".
140d0 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ** with database
140e0 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68   handle <db>. Th
140f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14100 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74  t must be a list
14110 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f   of three.** boo
14120 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20  lean values. If 
14130 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75  the first is tru
14140 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
14150 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  n of test_collat
14160 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72  e is.** register
14170 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
14180 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74   the second is t
14190 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
141a0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
141b0 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  .** UTF-16le, if
141c0 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72   the third is tr
141d0 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
141e0 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
141f0 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73  ble..** Previous
14200 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73   versions of tes
14210 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65  t_collate are de
14220 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
14230 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14240 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nce test_collate
14250 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
14260 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
14270 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  * following TCL 
14280 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
14290 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65  "test_collate <e
142a0 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22  nc> <lhs> <rhs>"
142b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e  .**.** The <lhs>
142c0 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74   and <rhs> are t
142d0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65  he two values be
142e0 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e  ing compared, en
142f0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
14300 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72  ** The <enc> par
14310 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e  ameter is the en
14320 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f  coding of the co
14330 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
14340 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20   that.** SQLite 
14350 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c  selected to call
14360 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73  . The TCL test s
14370 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73  cript implements
14380 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f   the.** "test_co
14390 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a  llate" proc..**.
143a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
143b0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b  s will only work
143c0 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70   with one interp
143d0 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
143e0 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
143f0 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
14400 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
14410 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
14420 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
14430 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
14440 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
14450 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
14460 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
14470 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
14480 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
14490 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
144a0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
144b0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
144c0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
144d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
144e0 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
144f0 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
14500 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  in = SQLITE_PTR_
14510 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20  TO_INT(pCtx);.  
14520 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
14530 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
14540 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
14550 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
14560 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14570 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
14580 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
14590 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
145a0 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
145b0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
145c0 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
145d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
145e0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
145f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
14600 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
14610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14620 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
14630 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
14640 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14650 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
14660 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
14670 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
14680 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
14690 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
146a0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
146b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
146c0 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
146d0 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
146e0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
146f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
14700 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
14710 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67   }..  sqlite3Beg
14720 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14730 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
14740 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
14750 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
14760 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
14770 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
14780 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
14790 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
147a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
147b0 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
147c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
147d0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
147e0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
147f0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
14800 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14810 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
14820 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
14830 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42  Str(pVal, nB, zB
14840 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
14850 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
14860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
14870 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
14880 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14890 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
148a0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
148b0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
148c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
148d0 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
148e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
148f0 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e(pVal);.  }.  s
14900 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
14910 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f  alloc();..  Tcl_
14920 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
14930 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
14940 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
14950 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14960 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
14970 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
14980 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
14990 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
149a0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f  E_TCLAPI test_co
149b0 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
149c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
149d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
149e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
149f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14a00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
14a10 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
14a20 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l;.  sqlite3_val
14a30 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
14a40 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
14a50 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
14a60 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
14a70 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
14a80 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
14a90 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14aa0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14ab0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
14ac0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
14ad0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14ae0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
14af0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14b00 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
14b10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
14b30 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
14b40 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
14b50 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
14b60 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
14b70 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
14b80 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
14b90 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
14ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14bb0 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
14bc0 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28  *zUtf16;.    if(
14bd0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
14be0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
14bf0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
14c00 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
14c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63  CL_ERROR;.    rc
14c20 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
14c30 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
14c40 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
14c50 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
14c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
14c70 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31  id *)SQLITE_UTF1
14c80 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  6LE, val?test_co
14c90 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
14ca0 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
14cb0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
14cc0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14cd0 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[4], &val) ) re
14ce0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14cf0 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73  .#if 0.    if( s
14d00 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
14d10 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  il>0 ){.      sq
14d20 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
14d30 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  l++;.    }.#endi
14d40 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
14d50 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
14d60 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
14d70 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14d80 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
14d90 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
14da0 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
14db0 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
14dc0 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
14dd0 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d  C);.    zUtf16 =
14de0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
14df0 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
14e00 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
14e10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14e20 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
14e30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14e60 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
14e70 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53  16(db, zUtf16, S
14e80 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
14e90 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
14ea0 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  *)SQLITE_UTF16BE
14eb0 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
14ec0 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20  te_func:0);.    
14ed0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
14ee0 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
14ef0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14f00 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
14f10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
14f20 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
14f30 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
14f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14f50 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d  R;.  .  if( rc!=
14f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14f80 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
14f90 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
14fa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
14fb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
14fc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
14fd0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
14fe0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14ff0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
15000 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
15010 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
15020 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15030 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
15040 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
15050 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
15060 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
15070 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
15080 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 75 74  age: add_test_ut
15090 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20 3c  f16bin_collate <
150a0 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41 64  db ptr>.**.** Ad
150b0 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c 61  d a utf-16 colla
150c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
150d0 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22 20 74  med "utf16bin" t
150e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
150f0 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 63  * handle. This c
15100 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15110 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67 75 6d  e compares argum
15120 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ents in the same
15130 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 62   way as the.** b
15140 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6f  uilt-in collatio
15150 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a 73  n "binary"..*/.s
15160 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75  tatic int test_u
15170 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f  tf16bin_collate_
15180 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
15190 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
151a0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
151b0 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
151c0 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e 74  oid *zB.){.  int
151d0 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20 3f   nCmp = (nA>nB ?
151e0 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e 74   nB : nA);.  int
151f0 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 41   res = memcmp(zA
15200 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20 69  , zB, nCmp);.  i
15210 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
15220 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65 74  = nA - nB;.  ret
15230 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69  urn res;.}.stati
15240 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
15250 41 50 49 20 74 65 73 74 5f 75 74 66 31 36 62 69  API test_utf16bi
15260 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69  n_collate(.  voi
15270 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15280 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15290 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
152a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
152b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
152c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
152d0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
152e0 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
152f0 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
15300 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
15310 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15320 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
15330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15340 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15350 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
15360 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 62 69 6e  on(db, "utf16bin
15370 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  ", SQLITE_UTF16,
15380 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 5f   0, .      test_
15390 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
153a0 5f 66 75 6e 63 0a 20 20 29 3b 0a 20 20 69 66 28  _func.  );.  if(
153b0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
153c0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
153d0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
153e0 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
153f0 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72   TCL_OK;..bad_ar
15400 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  gs:.  Tcl_WrongN
15410 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
15420 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
15430 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15440 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  R;.}../*.** When
15450 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e   the collation n
15460 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69  eeded callback i
15470 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72  s invoked, recor
15480 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a  d the name of .*
15490 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
154a0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
154b0 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72 65  on here.  The re
154c0 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c  corded name is l
154d0 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43  inked.** to a TC
154e0 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75  L variable and u
154f0 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
15500 20 74 68 61 74 20 74 68 65 20 72 65 71 75 65 73   that the reques
15510 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ted collation.**
15520 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74   name is correct
15530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
15540 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
15550 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63  n[200];.static c
15560 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c  har *pzNeededCol
15570 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64  lation = zNeeded
15580 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a  Collation;.../*.
15590 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61  ** Called when a
155a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
155b0 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20  nce is needed.  
155c0 52 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  Registered using
155d0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  .** sqlite3_coll
155e0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29  ation_needed16()
155f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15600 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
15610 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20  eded_cb(.  void 
15620 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65  *pCtx, .  sqlite
15630 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65  3 *db,.  int eTe
15640 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76  xtRep,.  const v
15650 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20  oid *pName.){.  
15660 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62  int enc = ENC(db
15670 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  );.  int i;.  ch
15680 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d  ar *z;.  for(z =
15690 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69   (char*)pName, i
156a0 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20  =0; *z || z[1]; 
156b0 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
156c0 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   ) zNeededCollat
156d0 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20  ion[i++] = *z;. 
156e0 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c   }.  zNeededColl
156f0 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20  ation[i] = 0;.  
15700 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15710 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20  ollation(.      
15720 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
15730 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 53 51 4c  e", ENC(db), SQL
15740 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65  ITE_INT_TO_PTR(e
15750 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  nc), test_collat
15760 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e_func);.}../*.*
15770 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
15780 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
15790 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
157a0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
157b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
157c0 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ded(.  void * cl
157d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
157e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
157f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15800 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15810 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15820 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
15830 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
15840 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
15850 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
15860 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15880 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
15890 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
158a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61   = sqlite3_colla
158b0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62  tion_needed16(db
158c0 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  , 0, test_collat
158d0 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20  e_needed_cb);.  
158e0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
158f0 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  [0] = 0;.  if( s
15900 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15910 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
15920 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15930 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
15940 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
15950 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  :.  Tcl_WrongNum
15960 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
15970 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72  objv, "DB");.  r
15980 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
159a0 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  :   add_alignmen
159b0 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
159c0 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20  s  DB.**.** Add 
159d0 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  two new collatin
159e0 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74  g sequences to t
159f0 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a  he database DB.*
15a00 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61  *.**     utf16_a
15a10 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74  ligned.**     ut
15a20 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a  f16_unaligned.**
15a30 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69  .** Both collati
15a40 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
15a50 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f   the same sort o
15a60 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a  rder as BINARY..
15a70 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66  ** The only diff
15a80 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74  erence is that t
15a90 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64  he utf16_aligned
15aa0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
15ab0 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72  quence is declar
15ac0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
15ad0 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
15ae0 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63   flag..** Both c
15af0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
15b00 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ns increment the
15b10 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36   unaligned utf16
15b20 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e   counter.** when
15b30 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20  ever they see a 
15b40 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69  string that begi
15b50 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74  ns on an odd byt
15b60 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73  e boundary..*/.s
15b70 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67  tatic int unalig
15b80 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
15b90 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  er = 0;.static i
15ba0 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  nt alignmentColl
15bb0 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
15bc0 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
15bd0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
15be0 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
15bf0 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
15c00 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
15c10 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79  c, n;.  n = nKey
15c20 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20  1<nKey2 ? nKey1 
15c30 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e  : nKey2;.  if( n
15c40 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key1>0 && 1==(1&
15c50 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
15c60 4e 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e  NT(pKey1))) ) un
15c70 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
15c80 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20  ounter++;.  if( 
15c90 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31  nKey2>0 && 1==(1
15ca0 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  &(SQLITE_PTR_TO_
15cb0 49 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75  INT(pKey2))) ) u
15cc0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
15cd0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20  counter++;.  rc 
15ce0 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
15cf0 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
15d00 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
15d10 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
15d20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15d30 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
15d40 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 61 64  SQLITE_TCLAPI ad
15d50 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
15d60 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76  _collations(.  v
15d70 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15d80 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15d90 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15da0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15db0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15dc0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15dd0 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20  if( objc>=2 ){. 
15de0 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
15df0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15e00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15e10 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
15e20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15e30 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
15e40 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
15e50 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c  tf16_unaligned",
15e60 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a   SQLITE_UTF16, .
15e70 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
15e80 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
15e90 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
15ea0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
15eb0 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c  "utf16_aligned",
15ec0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
15ed0 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20  IGNED, .        
15ee0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
15ef0 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Func);.  }.  ret
15f00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15f10 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15f20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15f30 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  UTF16) */../*.**
15f40 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
15f50 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
15f60 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
15f70 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
15f80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15f90 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
15fa0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
15fb0 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
15fc0 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
15fd0 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
15fe0 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
15ff0 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
16000 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
16010 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
16020 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
16030 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
16040 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
16050 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
16060 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
16070 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
16080 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
16090 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
160a0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
160b0 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
160c0 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
160d0 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
160e0 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
160f0 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
16100 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
16110 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
16120 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
16130 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
16140 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
16150 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
16160 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
16170 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
16180 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
16190 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
161a0 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
161b0 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
161c0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
161d0 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
161e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
161f0 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
16200 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
16210 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
16220 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
16230 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
16240 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
16250 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
16260 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
16270 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
16280 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
16290 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
162a0 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
162b0 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
162c0 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
162d0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
162e0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
162f0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
16300 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
16310 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
16320 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
16330 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
16340 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
16350 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
16360 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
16370 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
16380 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
16390 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e  TF-16BE..*/.#ifn
163a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163b0 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69  UTF16.static voi
163c0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
163d0 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
163e0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
163f0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
16400 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
16410 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
16420 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
16430 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
16440 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
16450 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
16460 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
16470 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
16480 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
16490 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
164a0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
164b0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
164c0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
164d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
164e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
164f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16500 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
16510 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
16520 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
16530 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
16540 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16550 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
16560 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
16570 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
16580 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
16590 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
165a0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
165b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
165c0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63  lt_text(pCtx, Tc
165d0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
165e0 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53  t(interp), -1, S
165f0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
16600 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
16610 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
16620 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
16630 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
16640 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
16650 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
16660 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
16670 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
16680 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16690 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73  text16be(pCtx, s
166a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
166b0 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16be(pVal),.   
166c0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
166d0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
166e0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
166f0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
16700 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
16710 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74  utf16le(.  sqlit
16720 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
16730 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
16740 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16750 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
16760 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
16770 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
16780 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
16790 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
167a0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
167b0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
167c0 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
167d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
167e0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
167f0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
16800 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
16810 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
16820 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
16830 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
16840 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
16850 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
16860 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
16870 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
16880 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
16890 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
168a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
168b0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
168c0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
168d0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
168e0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
168f0 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
16900 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
16910 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
16920 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
16930 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
16940 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
16950 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
16960 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
16970 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
16980 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
16990 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
169a0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
169b0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
169c0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
169d0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
169e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
169f0 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
16a00 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6be(.  sqlite3_c
16a10 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
16a20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
16a30 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
16a40 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
16a50 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
16a60 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
16a70 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
16a80 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
16a90 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
16aa0 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
16ab0 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
16ac0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
16ad0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
16ae0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
16af0 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
16b00 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
16b10 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
16b20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16b30 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29  ("UTF-16BE", -1)
16b40 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
16b50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
16b60 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
16b70 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16b80 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
16b90 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
16ba0 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
16bb0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
16bc0 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
16bd0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16be0 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
16bf0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
16c00 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
16c10 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
16c20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
16c30 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
16c40 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
16c50 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
16c60 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
16c70 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73  t_text16(pCtx, s
16c80 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
16c90 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
16ca0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
16cb0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
16cc0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
16cd0 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  6be(pCtx, sqlite
16ce0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65  3_value_text16le
16cf0 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
16d00 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
16d10 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  NT);.  sqlite3_r
16d20 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70  esult_text16le(p
16d30 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
16d40 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
16d50 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
16d60 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16d70 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
16d80 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64  ee(pVal);.}.#end
16d90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16da0 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69  T_UTF16 */.stati
16db0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
16dc0 41 50 49 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  API test_functio
16dd0 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
16de0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
16df0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16e00 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16e10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16e20 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
16e30 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16e40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16e50 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20  int val;..  if( 
16e60 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
16e70 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
16e80 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
16e90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
16ea0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
16eb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16ec0 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
16ed0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
16ee0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
16ef0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
16f00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16f10 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
16f20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
16f30 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
16f40 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
16f50 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
16f60 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  8, .        inte
16f70 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
16f80 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20  n_utf8, 0, 0);. 
16f90 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21   }.  if( TCL_OK!
16fa0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
16fb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16fc0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
16fd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16fe0 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20  ;.  if( val ){. 
16ff0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
17000 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
17010 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
17020 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  1, SQLITE_UTF16L
17030 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  E, .        inte
17040 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
17050 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29  n_utf16le, 0, 0)
17060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
17070 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
17080 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
17090 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
170a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
170b0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
170c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
170d0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
170e0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
170f0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
17100 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16BE, .        i
17110 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
17120 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c  tion_utf16be, 0,
17130 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
17140 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61  rn TCL_OK;.bad_a
17150 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
17160 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17170 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17180 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17190 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
171a0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
171b0 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
171c0 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
171d0 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65  tf16be>", 0);.#e
171e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
171f0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
17200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17230 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72  _test_errstr <er
17240 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
17250 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
17260 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
17270 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
17280 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
17290 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
172a0 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
172b0 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
172c0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
172d0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
172e0 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
172f0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
17300 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
17310 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
17320 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
17330 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
17340 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
17350 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
17360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
17370 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
17380 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64  t_errstr(.  void
17390 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
173a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
173b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
173c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
173d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
173e0 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74  ar *zCode;.  int
173f0 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   i;.  if( objc!=
17400 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
17410 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
17420 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72  , 1, objv, "<err
17430 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a  or code>");.  }.
17440 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47  .  zCode = Tcl_G
17450 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17460 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
17470 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  200; i++){.    i
17480 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45  f( 0==strcmp(t1E
17490 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f  rrorName(i), zCo
174a0 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  de) ) break;.  }
174b0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
174c0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
174d0 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  )sqlite3ErrStr(i
174e0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
174f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17500 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b   Usage:    break
17510 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  point.**.** This
17520 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20   routine exists 
17530 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20  for one purpose 
17540 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70  - to provide a p
17550 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a  lace to put a.**
17560 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68   breakpoint with
17570 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65   GDB that can be
17580 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67   triggered using
17590 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20   TCL code.  The 
175a0 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  use.** for this 
175b0 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63  is when a partic
175c0 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20  ular test fails 
175d0 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38  on (say) the 148
175e0 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a  5th iteration..*
175f0 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73  * In the TCL tes
17600 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e  t script, we can
17610 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74   add code like t
17620 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69  his:.**.**     i
17630 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65  f {$i==1485} bre
17640 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
17650 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75  en run testfixtu
17660 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67  re in the debugg
17670 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20  er and wait for 
17680 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  the breakpoint t
17690 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e  o.** fire.  Then
176a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61   additional brea
176b0 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73  kpoints can be s
176c0 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e  et to trace down
176d0 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61   the bug..*/.sta
176e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
176f0 43 4c 41 50 49 20 74 65 73 74 5f 62 72 65 61 6b  CLAPI test_break
17700 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e  point(.  void *N
17710 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
17720 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
17730 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
17740 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
17750 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
17760 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17780 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
17790 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
177a0 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
177b0 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
177c0 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
177d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
177e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
177f0 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  othing */.}../*.
17800 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17810 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
17820 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a  b  STMT IDX N.**
17830 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
17840 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
17850 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
17860 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
17870 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
17880 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
17890 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
178a0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
178b0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
178c0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
178d0 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
178e0 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
178f0 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
17900 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
17910 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
17920 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
17930 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17940 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17950 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17960 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17970 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17980 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
17990 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
179a0 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
179b0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
179c0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
179d0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
179e0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
179f0 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
17a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17a10 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17a20 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17a30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17a40 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17a50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17a60 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17a70 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17a80 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
17a90 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
17aa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17ab0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17ac0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
17ad0 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
17ae0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
17af0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
17b00 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
17b10 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
17b20 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17b30 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
17b40 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
17b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17b60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17b90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
17ba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17bb0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
17bc0 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20  ind_zeroblob64  
17bd0 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
17be0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
17bf0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  3_bind_zeroblob6
17c00 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
17c10 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
17c20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
17c30 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
17c40 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
17c50 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
17c60 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
17c70 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17c80 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
17c90 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
17ca0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
17cb0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
17cc0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
17cd0 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20 76  _zeroblob64(.  v
17ce0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17cf0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17d00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17d10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17d20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17d30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17d40 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17d50 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e  .  Tcl_WideInt n
17d60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
17d70 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
17d80 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17d90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17da0 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
17db0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17dc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17dd0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17de0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17df0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17e00 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17e20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17e30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17e40 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17e50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17e60 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
17e70 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
17e80 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
17e90 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  n) ) return TCL_
17ea0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17eb0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
17ec0 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69 64  blob64(pStmt, id
17ed0 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
17ee0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
17ef0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
17f00 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
17f10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17f20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
17f40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17f50 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
17f60 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
17f70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17f80 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
17f90 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17fa0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17fb0 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d  e3_bind_int  STM
17fc0 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
17fd0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
17fe0 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66  _bind_int interf
17ff0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
18000 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
18010 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
18020 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
18030 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
18040 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
18050 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
18060 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69  binds a 32-bit i
18070 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
18080 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
18090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
180a0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
180b0 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64  bind_int(.  void
180c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
180d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
180e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
180f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18100 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18110 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18120 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
18130 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  int value;.  int
18140 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
18150 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
18160 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18170 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18180 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18190 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
181a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
181b0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
181c0 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
181d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
181e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
181f0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
18200 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18210 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18220 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
18230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18240 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18250 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18260 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
18270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18280 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18290 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
182a0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
182b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
182c0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
182d0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
182e0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
182f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
18300 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
18310 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
18320 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
18330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18350 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
18360 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18370 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18380 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
18390 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64 72 20    intarray_addr 
183a0 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   INT  ....**.** 
183b0 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
183c0 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61  ss of a C-langua
183d0 67 65 20 61 72 72 61 79 20 6f 66 20 33 32 2d 62  ge array of 32-b
183e0 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a  it integers..**.
183f0 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
18400 20 74 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   the array is ob
18410 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
18420 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73  oc().  Call this
18430 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a   procedure once.
18440 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  ** with no argum
18450 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ents in order to
18460 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e   release memory.
18470 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74    Each call to t
18480 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  his procedure.**
18490 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
184a0 70 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a  previous array..
184b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
184c0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
184d0 5f 69 6e 74 61 72 72 61 79 5f 61 64 64 72 28 0a  _intarray_addr(.
184e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
184f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18500 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18510 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18520 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18530 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  {.  int i;.  sta
18540 74 69 63 20 69 6e 74 20 2a 70 20 3d 20 30 3b 0a  tic int *p = 0;.
18550 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18560 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69  p);.  p = 0;.  i
18570 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
18580 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
18590 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d  loc( sizeof(p[0]
185a0 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20  )*(objc-1) );.  
185b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
185c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
185d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62     for(i=0; i<ob
185e0 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  jc-1; i++){.    
185f0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18600 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18610 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d  objv[1+i], &p[i]
18620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
18630 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18640 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20        p = 0;.   
18650 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18660 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
18670 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c     }.  }  .  Tcl
18680 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18690 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
186a0 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33  eIntObj((sqlite3
186b0 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65  _int64)p));.  re
186c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
186d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 69 6e  *.** Usage:   in
186e0 74 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54  tarray_addr  INT
186f0 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75    ....**.** Retu
18700 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
18710 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61  f a C-language a
18720 72 72 61 79 20 6f 66 20 33 32 2d 62 69 74 20 69  rray of 32-bit i
18730 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53  ntegers..**.** S
18740 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
18750 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
18760 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
18770 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f  .  Call this pro
18780 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77  cedure once.** w
18790 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
187a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c   in order to rel
187b0 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61  ease memory.  Ea
187c0 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ch call to this 
187d0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65  procedure.** ove
187e0 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
187f0 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ious array..*/.s
18800 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18810 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74  _TCLAPI test_int
18820 36 34 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  64array_addr(.  
18830 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18840 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18850 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18860 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18870 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18880 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
18890 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
188a0 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  *p = 0;..  sqlit
188b0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20  e3_free(p);.  p 
188c0 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e  = 0;.  if( objc>
188d0 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  1 ){.    p = sql
188e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
188f0 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d  eof(p[0])*(objc-
18900 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  1) );.    if( p=
18910 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
18920 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69  ERROR;.    for(i
18930 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b  =0; i<objc-1; i+
18940 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69  +){.      Tcl_Wi
18950 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 69  deInt v;.      i
18960 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
18970 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18980 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 76 29 20   objv[1+i], &v) 
18990 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
189a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
189b0 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
189c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
189d0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
189e0 20 20 20 70 5b 69 5d 20 3d 20 76 3b 0a 20 20 20     p[i] = v;.   
189f0 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53   }.  }  .  Tcl_S
18a00 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18a10 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
18a20 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69  ntObj((sqlite3_i
18a30 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75  nt64)p));.  retu
18a40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
18a50 2a 2a 20 55 73 61 67 65 3a 20 20 20 64 6f 75 62  ** Usage:   doub
18a60 6c 65 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e  learray_addr  IN
18a70 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  T  ....**.** Ret
18a80 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
18a90 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20  of a C-language 
18aa0 61 72 72 61 79 20 6f 66 20 64 6f 75 62 6c 65 73  array of doubles
18ab0 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
18ac0 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20   hold the array 
18ad0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
18ae0 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c   malloc().  Call
18af0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
18b00 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20  once.** with no 
18b10 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64  arguments in ord
18b20 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  er to release me
18b30 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c  mory.  Each call
18b40 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75   to this procedu
18b50 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  re.** overwrites
18b60 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72   the previous ar
18b70 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
18b80 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
18b90 20 74 65 73 74 5f 64 6f 75 62 6c 65 61 72 72 61   test_doublearra
18ba0 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a  y_addr(.  void *
18bb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18bc0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18bd0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18be0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18bf0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
18c00 69 3b 0a 20 20 73 74 61 74 69 63 20 64 6f 75 62  i;.  static doub
18c10 6c 65 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71  le *p = 0;..  sq
18c20 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
18c30 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62   p = 0;.  if( ob
18c40 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20  jc>1 ){.    p = 
18c50 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
18c60 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62  sizeof(p[0])*(ob
18c70 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28  jc-1) );.    if(
18c80 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54   p==0 ) return T
18c90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f  CL_ERROR;.    fo
18ca0 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b  r(i=0; i<objc-1;
18cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18cc0 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
18cd0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18ce0 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29 20  jv[1+i], &p[i]) 
18cf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18d00 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
18d10 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
18d20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18d30 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
18d40 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53   }.  }  .  Tcl_S
18d50 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18d60 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
18d70 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69  ntObj((sqlite3_i
18d80 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75  nt64)p));.  retu
18d90 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
18da0 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 78 74  ** Usage:   text
18db0 61 72 72 61 79 5f 61 64 64 72 20 20 54 45 58 54  array_addr  TEXT
18dc0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72   ....**.** Retur
18dd0 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
18de0 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72   a C-language ar
18df0 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a  ray of strings..
18e00 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
18e10 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73  old the array is
18e20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
18e30 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74  alloc().  Call t
18e40 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e  his procedure on
18e50 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72  ce.** with no ar
18e60 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  guments in order
18e70 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
18e80 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ry.  Each call t
18e90 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  o this procedure
18ea0 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
18eb0 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61  he previous arra
18ec0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18ed0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
18ee0 65 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64  est_textarray_ad
18ef0 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  dr(.  void * cli
18f00 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18f10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18f20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18f30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18f40 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  [].){.  int i;. 
18f50 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20   static int n = 
18f60 30 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  0;.  static char
18f70 20 2a 2a 70 20 3d 20 30 3b 0a 0a 20 20 66 6f 72   **p = 0;..  for
18f80 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
18f90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 5b 69  sqlite3_free(p[i
18fa0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ]);.  sqlite3_fr
18fb0 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a  ee(p);.  p = 0;.
18fc0 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a    if( objc>1 ){.
18fd0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f      p = sqlite3_
18fe0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  malloc( sizeof(p
18ff0 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b  [0])*(objc-1) );
19000 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
19010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19020 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19030 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20  <objc-1; i++){. 
19040 20 20 20 20 20 70 5b 69 5d 20 3d 20 73 71 6c 69       p[i] = sqli
19050 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
19060 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19070 6f 62 6a 76 5b 31 2b 69 5d 29 29 3b 0a 20 20 20  objv[1+i]));.   
19080 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 6f 62 6a   }.  }.  n = obj
19090 63 2d 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  c-1;.  Tcl_SetOb
190a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
190b0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
190c0 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  j((sqlite3_int64
190d0 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  )p));.  return T
190e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
190f0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
19100 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54  3_bind_int64  ST
19110 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
19120 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
19130 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74  3_bind_int64 int
19140 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
19150 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
19160 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
19170 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
19180 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
19190 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
191a0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
191b0 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69  ** binds a 64-bi
191c0 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
191d0 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
191e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
191f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
19200 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20  st_bind_int64(. 
19210 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
19220 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19230 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19240 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19250 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19260 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
19270 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
19280 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  x;.  Tcl_WideInt
19290 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
192a0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
192b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
192c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
192d0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
192e0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
192f0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
19300 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
19310 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
19320 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
19330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19340 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
19350 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19360 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19370 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19380 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19390 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
193a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
193b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
193c0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
193d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
193e0 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
193f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19400 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
19410 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19420 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
19430 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
19440 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
19450 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
19460 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
19470 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
19480 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
19490 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
194a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
194b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
194c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
194d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
194e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
194f0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
19500 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e  d_double  STMT N
19510 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
19520 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
19530 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66  nd_double interf
19540 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
19550 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
19560 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
19570 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
19580 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
19590 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
195a0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
195b0 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69  binds a 64-bit i
195c0 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
195d0 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
195e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
195f0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
19600 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
19610 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19620 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19630 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19640 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19650 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19660 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19670 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
19680 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20  .  double value 
19690 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
196a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
196b0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  l;.  int i;.  st
196c0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
196d0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
196e0 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
196f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70  * Name of the sp
19700 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70  ecial floating p
19710 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  oint value */.  
19720 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
19730 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65  Upper;   /* Uppe
19740 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20  r 32 bits */.   
19750 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c   unsigned int iL
19760 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72  ower;   /* Lower
19770 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20   32 bits */.  } 
19780 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b  aSpecialFp[] = {
19790 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20  .    {  "NaN",  
197a0 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20      0x7fffffff, 
197b0 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
197c0 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20    {  "SNaN",    
197d0 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66   0x7ff7ffff, 0xf
197e0 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
197f0 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78    "-NaN",     0x
19800 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  ffffffff, 0xffff
19810 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
19820 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66  -SNaN",    0xfff
19830 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
19840 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e  f },.    {  "+In
19850 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30  f",     0x7ff000
19860 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
19870 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c  ,.    {  "-Inf",
19880 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c       0xfff00000,
19890 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
198a0 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c     {  "Epsilon",
198b0 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78    0x00000000, 0x
198c0 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20  00000001 },.    
198d0 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30  {  "-Epsilon", 0
198e0 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x80000000, 0x000
198f0 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
19900 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66  "NaN0",     0x7f
19910 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f80000, 0x000000
19920 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e  00 },.    {  "-N
19930 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30  aN0",    0xfff80
19940 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
19950 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
19960 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
19970 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19980 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19990 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
199a0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
199b0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
199c0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
199d0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
199e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
199f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19a00 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19a10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19a20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19a30 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19a40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19a50 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19a60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19a70 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
19a80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19a90 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65  R;..  /* Interce
19aa0 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e  pt the string "N
19ab0 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65  aN" and generate
19ac0 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72   a NaN value for
19ad0 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74   it..  ** All ot
19ae0 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20  her strings are 
19af0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
19b00 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  o Tcl_GetDoubleF
19b10 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54  romObj()..  ** T
19b20 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
19b30 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64  Obj() should und
19b40 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75  erstand "NaN" bu
19b50 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a  t some versions.
19b60 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62    ** contain a b
19b70 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20  ug..  */.  zVal 
19b80 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
19b90 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28  objv[3]);.  for(
19ba0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
19bb0 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
19bc0 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b  (aSpecialFp[0]);
19bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
19be0 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70  trcmp(aSpecialFp
19bf0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29  [i].zName, zVal)
19c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
19c10 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20  ite3_uint64 x;. 
19c20 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61       x = aSpecia
19c30 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20  lFp[i].iUpper;. 
19c40 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20       x <<= 32;. 
19c50 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69       x |= aSpeci
19c60 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a  alFp[i].iLower;.
19c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
19c80 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29  zeof(value)==8 )
19c90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19ca0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a  sizeof(x)==8 );.
19cb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61        memcpy(&va
19cc0 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20  lue, &x, 8);.   
19cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19ce0 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
19cf0 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
19d00 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
19d10 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20  p[0]) &&.       
19d20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
19d30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19d40 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
19d50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
19d60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
19d70 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
19d80 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
19d90 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
19da0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
19db0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
19dc0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
19dd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19de0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
19df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19e10 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
19e20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19e30 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
19e40 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54  e3_bind_null  ST
19e50 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  MT N.**.** Test 
19e60 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
19e70 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  _null interface.
19e80 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
19e90 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
19ea0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
19eb0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
19ec0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
19ed0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
19ee0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
19ef0 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  s a NULL to the 
19f00 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
19f10 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
19f20 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
19f30 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
19f40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19f50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19f60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19f70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19f80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
19f90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
19fa0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
19fb0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19fc0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19fd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19fe0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19ff0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a000 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1a010 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1a020 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
1a030 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
1a040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a050 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1a060 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1a070 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1a080 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1a090 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a0a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1a0b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a0c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1a0d0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
1a0e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
1a0f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1a100 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
1a110 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a120 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
1a130 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
1a140 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1a150 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1a160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a170 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a180 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
1a190 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a1a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1a1b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1a1c0 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
1a1d0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
1a1e0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
1a1f0 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
1a200 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
1a210 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
1a220 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
1a230 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
1a240 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
1a250 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
1a260 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
1a270 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
1a280 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
1a290 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
1a2a0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
1a2b0 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
1a2c0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1a2d0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
1a2e0 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64  ind_text(.  void
1a2f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a300 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a310 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1a320 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1a330 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1a340 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1a350 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
1a360 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
1a370 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
1a380 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1a390 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
1a3a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a3b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a3c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a3d0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1a3e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1a3f0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
1a400 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22  T N VALUE BYTES"
1a410 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a430 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1a440 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1a450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a460 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1a470 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a480 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1a490 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1a4a0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
1a4b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a4c0 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
1a4d0 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
1a4e0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1a4f0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a  jv[3], &bytes);.
1a500 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a510 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a520 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
1a530 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a540 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1a550 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
1a560 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
1a570 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
1a580 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
1a590 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1a5a0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
1a5b0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
1a5c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a5d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
1a5e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a5f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a600 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
1a610 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
1a620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a630 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
1a640 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a650 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1a660 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1a670 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  t16 ?-static? ST
1a680 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45  MT N STRING BYTE
1a690 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
1a6a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1a6b0 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20  xt16 interface. 
1a6c0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
1a6d0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
1a6e0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
1a6f0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
1a700 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
1a710 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
1a720 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
1a730 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
1a740 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
1a750 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
1a760 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
1a770 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
1a780 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1a790 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
1a7a0 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69  nd_text16(.  voi
1a7b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a7c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a7d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1a7e0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1a7f0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1a800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a810 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1a820 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1a830 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
1a840 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
1a850 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
1a860 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76    void (*xDel)(v
1a870 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36  oid*) = (objc==6
1a880 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53  ?SQLITE_STATIC:S
1a890 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1a8a0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74  ;.  Tcl_Obj *oSt
1a8b0 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  mt    = objv[obj
1a8c0 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-4];.  Tcl_Obj 
1a8d0 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76  *oN       = objv
1a8e0 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f  [objc-3];.  Tcl_
1a8f0 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20  Obj *oString  = 
1a900 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20  objv[objc-2];.  
1a910 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20  Tcl_Obj *oBytes 
1a920 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d    = objv[objc-1]
1a930 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
1a940 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20   && objc!=6){.  
1a950 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a960 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a970 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a980 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1a990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1a9a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1a9b0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
1a9c0 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
1a9d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a9e0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1a9f0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1aa00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1aa10 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74  ing(oStmt), &pSt
1aa20 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1aa30 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1aa40 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1aa50 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78  interp, oN, &idx
1aa60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1aa70 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
1aa80 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
1aa90 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1aaa0 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66  String, 0);.  if
1aab0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1aac0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74  Obj(interp, oByt
1aad0 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  es, &bytes) ) re
1aae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1aaf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ab00 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d  bind_text16(pStm
1ab10 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29  t, idx, (void *)
1ab20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
1ab30 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  el);.  if( sqlit
1ab40 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1ab50 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
1ab60 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
1ab70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ab80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ab90 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
1aba0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1abb0 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1abc0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
1abd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1abe0 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .  }..#endif /* 
1abf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1ac00 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1ac10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ac20 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1ac30 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74  bind_blob ?-stat
1ac40 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20  ic? STMT N DATA 
1ac50 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
1ac60 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
1ac70 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  d_blob interface
1ac80 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
1ac90 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
1aca0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
1acb0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
1acc0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
1acd0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
1ace0 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
1acf0 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65  ds a BLOB to the
1ad00 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
1ad10 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79  BLOB is BYTES by
1ad20 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
1ad30 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1ad40 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
1ad50 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  nd_blob(.  void 
1ad60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ad70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ad80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ad90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ada0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1adb0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1adc0 3b 0a 20 20 69 6e 74 20 6c 65 6e 2c 20 69 64 78  ;.  int len, idx
1add0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
1ade0 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
1adf0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1ae00 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70  3_destructor_typ
1ae10 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  e xDestructor = 
1ae20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1ae30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
1ae40 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20   && objc!=6 ){. 
1ae50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ae60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ae70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ae80 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1ae90 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1aea0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1aeb0 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54  0), " STMT N DAT
1aec0 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  A BYTES", 0);.  
1aed0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1aee0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
1aef0 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44  bjc==6 ){.    xD
1af00 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
1af10 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f  TE_STATIC;.    o
1af20 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  bjv++;.  }..  if
1af30 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1af40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1af50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1af60 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1af70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1af80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1af90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1afa0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
1afb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1afc0 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72  .  value = (char
1afd0 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
1afe0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
1aff0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  ], &len);.  if( 
1b000 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1b010 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
1b020 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1b030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1b040 20 20 69 66 28 20 62 79 74 65 73 3e 6c 65 6e 20    if( bytes>len 
1b050 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
1b060 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
1b070 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1b080 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 0a  of(zBuf), zBuf,.
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 75 73 65       "cannot use
1b0b0 20 25 64 20 62 6c 6f 62 20 62 79 74 65 73 2c 20   %d blob bytes, 
1b0c0 68 61 76 65 20 25 64 22 2c 20 62 79 74 65 73 2c  have %d", bytes,
1b0d0 20 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41   len);.    Tcl_A
1b0e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b0f0 72 70 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a 20  rp, zBuf, -1);. 
1b100 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b110 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
1b120 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1b130 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
1b140 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
1b150 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
1b160 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1b170 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
1b180 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
1b190 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b1a0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1b1b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b1c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b1d0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1b1e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b1f0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1b200 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1b210 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
1b220 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1b230 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
1b240 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
1b250 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
1b260 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1b270 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
1b280 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
1b290 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b2a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b2b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b2c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b2d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b2e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1b2f0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1b300 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1b310 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b320 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b330 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
1b340 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b350 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
1b360 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1b370 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b380 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1b390 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b3a0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
1b3b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1b3c0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1b3d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1b3e0 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
1b3f0 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
1b400 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b410 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1b420 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b430 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a  name  STMT  N.**
1b440 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b450 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77  ame of the Nth w
1b460 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69  ildcard.  The fi
1b470 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20  rst wildcard is 
1b480 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73  1..** An empty s
1b490 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
1b4a0 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  d if N is out of
1b4b0 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65   range or if the
1b4c0 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20   wildcard.** is 
1b4d0 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61  nameless..*/.sta
1b4e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1b4f0 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
1b500 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a  parameter_name(.
1b510 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b520 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b530 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b540 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b550 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b560 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1b570 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
1b580 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1b590 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1b5a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1b5b0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
1b5c0 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
1b5d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b5e0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1b5f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b600 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b610 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1b620 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b630 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b640 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b650 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72  objv[2], &i) ) r
1b660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b670 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1b680 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
1b690 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1b6a0 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  bj(sqlite3_bind_
1b6b0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
1b6c0 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b  Stmt,i),-1).  );
1b6d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b6e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b6f0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
1b700 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
1b710 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a    STMT  NAME.**.
1b720 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1b730 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63  dex of the wildc
1b740 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ard called NAME.
1b750 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
1b760 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63  ere is.** no suc
1b770 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  h wildcard..*/.s
1b780 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1b790 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
1b7a0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1b7b0 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
1b7c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b7d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b7e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b7f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b800 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1b810 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
1b820 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1b830 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b840 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b850 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
1b860 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b870 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b880 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1b890 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b8a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b8b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1b8c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b8d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b8e0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
1b8f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
1b900 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b910 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
1b920 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
1b930 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
1b940 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
1b950 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b960 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1b970 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
1b980 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
1b990 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1b9a0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6c  E_TCLAPI test_cl
1b9b0 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20  ear_bindings(.  
1b9c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b9d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b9e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b9f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ba00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ba10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ba20 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1ba30 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1ba40 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ba50 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1ba60 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
1ba70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ba80 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
1ba90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1baa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1bab0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1bac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bad0 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
1bae0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1baf0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1bb00 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
1bb10 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  gs(pStmt)));.  r
1bb20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1bb30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1bb40 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49  sqlite3_sleep MI
1bb50 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74  LLISECONDS.*/.st
1bb60 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1bb70 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6c 65 65  TCLAPI test_slee
1bb80 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
1bb90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1bba0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1bbb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1bbc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1bbd0 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a  ].){.  int ms;..
1bbe0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1bbf0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1bc00 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1bc10 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
1bc20 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75  ONDS");.    retu
1bc30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bc40 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
1bc50 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1bc60 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20  , objv[1], &ms) 
1bc70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1bc80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1bc90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1bca0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1bcb0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c  ntObj(sqlite3_sl
1bcc0 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74  eep(ms)));.  ret
1bcd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1bce0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1bcf0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
1bd00 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
1bd10 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
1bd20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1bd30 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1bd40 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
1bd50 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
1bd60 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
1bd70 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
1bd80 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1bd90 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28  test_ex_errcode(
1bda0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1bdb0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1bdc0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1bdd0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1bde0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1bdf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1be00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1be10 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1be20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1be30 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1be40 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1be50 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1be60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1be70 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1be80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1be90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1bea0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1beb0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1bec0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1bed0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1bee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1bef0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1bf00 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  d_errcode(db);. 
1bf10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bf20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1bf30 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1bf40 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1bf50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
1bf60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1bf70 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
1bf80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
1bf90 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
1bfa0 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
1bfb0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
1bfc0 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
1bfd0 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
1bfe0 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
1bff0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1c000 41 50 49 20 74 65 73 74 5f 65 72 72 63 6f 64 65  API test_errcode
1c010 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c020 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c030 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c040 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c050 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c060 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1c070 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1c080 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c090 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c0a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1c0b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c0c0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1c0d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1c0e0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
1c0f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c100 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c110 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1c120 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c130 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c140 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1c150 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1c160 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1c170 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  e(db);.  Tcl_App
1c180 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c190 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1c1a0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1c1b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1c1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1c1d0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1c1e0 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1c1f0 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72  s the UTF-8 repr
1c200 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1c210 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
1c220 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
1c230 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
1c240 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
1c250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c260 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1c270 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
1c280 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c290 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c2a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c2b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c2c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c2d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1c2e0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
1c2f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1c300 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c310 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c320 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1c330 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1c340 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1c350 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1c360 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1c370 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c380 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1c390 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c3a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c3b0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1c3c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1c3d0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
1c3e0 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
1c3f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c400 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1c410 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
1c420 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1c430 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1c440 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
1c450 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
1c460 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
1c470 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1c480 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
1c490 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
1c4a0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
1c4b0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1c4c0 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
1c4d0 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
1c4e0 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
1c4f0 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
1c500 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
1c510 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
1c520 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
1c530 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
1c540 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
1c550 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1c560 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72  _TCLAPI test_err
1c570 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  msg16(.  void * 
1c580 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c590 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c5a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c5b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c5c0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1c5d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1c5e0 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1c5f0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1c600 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zErr;.  const ch
1c610 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74  ar *z;.  int byt
1c620 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  es = 0;..  if( o
1c630 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c640 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1c650 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1c660 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1c670 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1c680 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c690 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
1c6a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c6b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1c6c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1c6d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c6e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1c6f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c700 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
1c710 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
1c720 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  (db);.  if( zErr
1c730 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72   ){.    z = zErr
1c740 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d  ;.    for(bytes=
1c750 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a  0; z[bytes] || z
1c760 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73  [bytes+1]; bytes
1c770 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c  +=2){}.  }.  Tcl
1c780 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c790 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
1c7a0 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20  eArrayObj(zErr, 
1c7b0 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20  bytes));.#endif 
1c7c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1c7d0 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1c7e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c7f0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c800 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20  _prepare DB sql 
1c810 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1c820 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1c830 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1c840 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1c850 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1c860 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1c870 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1c880 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1c890 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1c8a0 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1c8b0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1c8c0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1c8d0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1c8e0 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1c8f0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1c900 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1c910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1c920 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1c930 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69  t_prepare(.  voi
1c940 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c950 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c960 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c970 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c980 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c990 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1c9a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
1c9b0 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
1c9c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
1c9d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1c9e0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1c9f0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1ca00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1ca10 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1ca20 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1ca30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ca40 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ca50 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ca60 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1ca70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1ca80 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1ca90 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1caa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1cac0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1cad0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1cae0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1caf0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1cb00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1cb10 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1cb20 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
1cb30 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1cb40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1cb50 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1cb60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1cb70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1cb80 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
1cb90 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1cba0 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1cbb0 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73   : 0);.  Tcl_Res
1cbc0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1cbd0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1cbe0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1cbf0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1cc00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cc10 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62   if( zTail && ob
1cc20 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1cc30 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1cc40 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1cc50 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1cc60 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1cc70 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  if( (int)strlen(
1cc80 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a  zTail)<bytes ){.
1cc90 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 28 69        bytes = (i
1cca0 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29  nt)strlen(zTail)
1ccb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
1ccc0 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1ccd0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
1cce0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1ccf0 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
1cd00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1cd10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cd20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1cd30 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1cd40 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1cd50 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1cd60 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1cd70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cd80 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1cd90 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1cda0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1cdb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cdc0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1cdd0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1cde0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1cdf0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1ce00 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1ce10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1ce20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ce30 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1ce40 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1ce50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ce60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1ce70 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20 73  _prepare_v2 DB s
1ce80 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1ce90 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1cea0 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1ceb0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1cec0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1ced0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1cee0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1cef0 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1cf00 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1cf10 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1cf20 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1cf30 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1cf40 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1cf50 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1cf60 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1cf70 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1cf80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1cf90 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1cfa0 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28  test_prepare_v2(
1cfb0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1cfc0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1cfd0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1cfe0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1cff0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d000 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1d010 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d020 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43  zSql;.  char *zC
1d030 6f 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  opy = 0;        
1d040 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f          /* mallo
1d050 63 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c  c() copy of zSql
1d060 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b   */.  int bytes;
1d070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d080 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
1d090 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1d0a0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1d0b0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
1d0c0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1d0d0 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1d0e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d0f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1d100 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1d110 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1d120 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d130 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1d140 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
1d150 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d160 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d170 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1d180 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1d190 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1d1a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1d1b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1d1c0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
1d1d0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
1d1e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1d1f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1d200 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1d210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d220 0a 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f  ..  /* Instead o
1d230 66 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72  f using zSql dir
1d240 65 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f  ectly, make a co
1d250 70 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  py into a buffer
1d260 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64   obtained.  ** d
1d270 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c  irectly from mal
1d280 6c 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20  loc(). The idea 
1d290 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  is to make it ea
1d2a0 73 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e  sier for valgrin
1d2b0 64 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62  d.  ** to spot b
1d2c0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e  uffer overreads.
1d2d0 20 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73    */.  if( bytes
1d2e0 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79  >=0 ){.    zCopy
1d2f0 20 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29   = malloc(bytes)
1d300 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
1d310 70 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29  py, zSql, bytes)
1d320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d330 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
1d340 65 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20  en(zSql) + 1;.  
1d350 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1d360 28 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (n);.    memcpy(
1d370 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b  zCopy, zSql, n);
1d380 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1d390 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
1d3a0 62 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c  b, zCopy, bytes,
1d3b0 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35   &pStmt, objc>=5
1d3c0 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a   ? &zTail : 0);.
1d3d0 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20    free(zCopy);. 
1d3e0 20 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28   zTail = &zSql[(
1d3f0 7a 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b  zTail - zCopy)];
1d400 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ..  assert(rc==S
1d410 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
1d420 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73  t==0);.  Tcl_Res
1d430 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1d440 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1d450 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1d460 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1d470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d490 4f 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f  OK && zTail && o
1d4a0 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1d4b0 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1d4c0 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
1d4d0 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
1d4e0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
1d4f0 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1d500 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1d510 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
1d520 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
1d530 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
1d540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d550 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d560 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
1d570 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d580 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1d590 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1d5a0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1d5b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d5c0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1d5d0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1d5e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d5f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1d600 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1d610 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1d620 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1d630 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1d640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d650 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1d660 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d670 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1d680 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d690 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d6a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
1d6b0 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47  t3134 DB.**.** G
1d6c0 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72  enerate a prepar
1d6d0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  ed statement for
1d6e0 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72   a zero-byte str
1d6f0 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a  ing as a test.**
1d700 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33   for ticket #313
1d710 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73  4.  The string s
1d720 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65  hould be precede
1d730 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65  d by a zero byte
1d740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d750 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1d760 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
1d770 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  34(.  void * cli
1d780 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1d790 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1d7a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1d7b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1d7c0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1d7d0 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  *db;.  static co
1d7e0 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20  nst char zSql[] 
1d7f0 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22  = "\000SELECT 1"
1d800 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1d810 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1d820 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
1d830 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1d840 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1d850 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d860 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d870 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d880 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d890 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d8a0 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1d8b0 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
1d8c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d8d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1d8e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1d8f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d900 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d910 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1d920 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1d930 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1d940 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20  2(db, &zSql[1], 
1d950 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  0, &pStmt, 0);. 
1d960 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1d970 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
1d980 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1d990 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1d9a0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1d9b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d9c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d9d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1d9e0 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
1d9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1da00 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1da10 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
1da20 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
1da30 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1da40 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
1da50 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
1da60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1da70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1da80 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1da90 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1daa0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1dab0 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
1dac0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1dad0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
1dae0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1daf0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1db00 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1db10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1db20 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1db30 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65  re16 DB sql byte
1db40 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
1db50 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
1db60 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
1db70 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
1db80 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
1db90 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
1dba0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
1dbb0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
1dbc0 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
1dbd0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
1dbe0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
1dbf0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
1dc00 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
1dc10 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
1dc20 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
1dc30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1dc40 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1dc50 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70  TCLAPI test_prep
1dc60 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  are16(.  void * 
1dc70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1dc80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dc90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1dca0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1dcb0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1dcc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1dcd0 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1dce0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1dcf0 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  zSql;.  const vo
1dd00 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  id *zTail = 0;. 
1dd10 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20   Tcl_Obj *pTail 
1dd20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1dd30 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1dd40 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1dd50 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
1dd60 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20  t bytes;        
1dd70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1dd80 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64  nteger specified
1dd90 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69   as arg 3 */.  i
1dda0 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20  nt objlen;      
1ddb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ddc0 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74  byte-array lengt
1ddd0 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20  h of arg 2 */.. 
1dde0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
1ddf0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
1de00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1de10 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1de20 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1de30 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1de40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1de50 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1de60 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c  ytes ?tailvar?",
1de70 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1de80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1de90 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1dea0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1deb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1dec0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1ded0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1dee0 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
1def0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1df00 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
1df10 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1df20 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1df30 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1df40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1df50 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1df60 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62  te3_prepare16(db
1df70 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
1df80 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
1df90 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
1dfa0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1dfb0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1dfc0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1dfd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1dfe0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1dff0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e000 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20  ..  if( objc>=5 
1e010 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c  ){.    if( zTail
1e020 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e   ){.      objlen
1e030 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74   = objlen - (int
1e040 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75  )((u8 *)zTail-(u
1e050 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  8 *)zSql);.    }
1e060 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c  else{.      objl
1e070 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
1e080 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65    pTail = Tcl_Ne
1e090 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
1e0a0 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65  8 *)zTail, objle
1e0b0 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  n);.    Tcl_Incr
1e0c0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1e0d0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
1e0e0 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
1e0f0 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30  [4], 0, pTail, 0
1e100 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1e110 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1e120 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1e130 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1e140 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1e150 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1e160 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1e170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e180 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
1e190 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1e1a0 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
1e1b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1e1c0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1e1d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e1e0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e1f0 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20  prepare16_v2 DB 
1e200 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1e210 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
1e220 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1e230 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1e240 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1e250 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1e260 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1e270 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1e280 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1e290 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1e2a0 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1e2b0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1e2c0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1e2d0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1e2e0 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1e2f0 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1e300 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e310 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1e320 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
1e330 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1e340 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e350 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e360 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1e370 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1e380 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1e390 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1e3a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e3b0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
1e3c0 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
1e3d0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
1e3e0 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
1e3f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1e400 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1e410 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
1e420 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
1e430 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
1e440 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1e450 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
1e460 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
1e470 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
1e480 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
1e490 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
1e4a0 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
1e4b0 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1e4c0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1e4d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e4e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e4f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e500 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1e510 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1e520 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1e530 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
1e540 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e550 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1e560 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1e570 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1e580 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1e590 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1e5a0 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1e5b0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1e5c0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
1e5d0 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
1e5e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1e5f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1e600 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1e610 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e620 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1e630 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62  _prepare16_v2(db
1e640 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
1e650 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
1e660 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
1e670 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1e680 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1e690 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1e6a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1e6b0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1e6c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e6d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20  ..  if( objc>=5 
1e6e0 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c  ){.    if( zTail
1e6f0 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e   ){.      objlen
1e700 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74   = objlen - (int
1e710 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75  )((u8 *)zTail-(u
1e720 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  8 *)zSql);.    }
1e730 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c  else{.      objl
1e740 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
1e750 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65    pTail = Tcl_Ne
1e760 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
1e770 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65  8 *)zTail, objle
1e780 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  n);.    Tcl_Incr
1e790 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1e7a0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
1e7b0 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
1e7c0 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30  [4], 0, pTail, 0
1e7d0 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1e7e0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1e7f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1e800 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1e810 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1e820 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1e830 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1e840 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e850 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
1e860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1e870 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
1e880 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1e890 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1e8a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e8b0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e8c0 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f  open filename ?o
1e8d0 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a  ptions-list?.*/.
1e8e0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1e8f0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70  E_TCLAPI test_op
1e900 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
1e910 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e920 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e930 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1e940 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1e950 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1e960 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1e970 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e980 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1e990 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
1e9a0 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
1e9b0 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1e9c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e9d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e9e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e9f0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1ea00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1ea10 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1ea20 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1ea30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ea40 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1ea50 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
1ea60 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
1ea70 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
1ea80 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
1ea90 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1eaa0 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1eab0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1eac0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1ead0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1eae0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1eaf0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1eb00 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1eb10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1eb20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1eb30 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49  lite3_open_v2 FI
1eb40 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53  LENAME FLAGS VFS
1eb50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1eb60 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1eb70 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69  t_open_v2(.  voi
1eb80 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1eb90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1eba0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ebb0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1ebc0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1ebd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1ebe0 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  name;.  const ch
1ebf0 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20  ar *zVfs;.  int 
1ec00 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
1ec10 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1ec20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  rc;.  char zBuf[
1ec30 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c  100];..  int nFl
1ec40 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ag;.  Tcl_Obj **
1ec50 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b  apFlag;.  int i;
1ec60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
1ec70 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ec80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ec90 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41  1, objv, "FILENA
1eca0 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a  ME FLAGS VFS");.
1ecb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ecc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  RROR;.  }.  zFil
1ecd0 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
1ece0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
1ecf0 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74    zVfs = Tcl_Get
1ed00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
1ed10 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d  .  if( zVfs[0]==
1ed20 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b  0x00 ) zVfs = 0;
1ed30 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73  ..  rc = Tcl_Lis
1ed40 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
1ed50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1ed60 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67   &nFlag, &apFlag
1ed70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
1ed80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ed90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46  .  for(i=0; i<nF
1eda0 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lag; i++){.    i
1edb0 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74  nt iFlag;.    st
1edc0 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a  ruct OpenFlag {.
1edd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ede0 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69   *zFlag;.      i
1edf0 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61  nt flag;.    } a
1ee00 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Flag[] = {.     
1ee10 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ee20 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54  READONLY", SQLIT
1ee30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1ee40 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ee50 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1ee60 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1ee70 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20  READWRITE },.   
1ee80 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ee90 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54  N_CREATE", SQLIT
1eea0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
1eeb0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1eec0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1eed0 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  OSE", SQLITE_OPE
1eee0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
1eef0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ef00 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1ef10 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1ef20 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20  EXCLUSIVE },.   
1ef30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ef40 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51  N_AUTOPROXY", SQ
1ef50 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
1ef60 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  OXY },.      { "
1ef70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ef80 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1ef90 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20  N_MAIN_DB },.   
1efa0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1efb0 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49  N_TEMP_DB", SQLI
1efc0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
1efd0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1efe0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1eff0 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  T_DB", SQLITE_OP
1f000 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
1f010 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f020 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1f030 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1f040 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1f050 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f060 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
1f070 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1f080 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
1f090 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f0a0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1f0b0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1f0c0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20  _SUBJOURNAL },. 
1f0d0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f0e0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1f0f0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1f100 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1f110 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f120 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22  TE_OPEN_NOMUTEX"
1f130 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  , SQLITE_OPEN_NO
1f140 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b  MUTEX },.      {
1f150 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   "SQLITE_OPEN_FU
1f160 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45  LLMUTEX", SQLITE
1f170 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
1f180 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f190 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
1f1a0 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1f1b0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
1f1c0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1f1d0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
1f1e0 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  HE", SQLITE_OPEN
1f1f0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
1f200 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1f210 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49  _OPEN_WAL", SQLI
1f220 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20  TE_OPEN_WAL },. 
1f230 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f240 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45  PEN_URI", SQLITE
1f250 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20  _OPEN_URI },.   
1f260 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
1f270 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  };.    rc = Tcl_
1f280 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53  GetIndexFromObjS
1f290 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70  truct(interp, ap
1f2a0 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20  Flag[i], aFlag, 
1f2b0 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29  sizeof(aFlag[0])
1f2c0 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67  , .        "flag
1f2d0 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20  ", 0, &iFlag.   
1f2e0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1f2f0 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
1f300 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  rc;.    flags |=
1f310 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c   aFlag[iFlag].fl
1f320 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ag;.  }..  rc = 
1f330 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1f340 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20  zFilename, &db, 
1f350 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20  flags, zVfs);.  
1f360 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1f370 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1f380 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1f390 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f3a0 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1f3b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1f3c0 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1f3d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f3e0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f3f0 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
1f400 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
1f410 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1f420 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 31  CLAPI test_open1
1f430 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1f440 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f450 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f460 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1f470 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1f480 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1f490 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1f4a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1f4b0 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1f4c0 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
1f4d0 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1f4e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1f4f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f500 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f510 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f520 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1f530 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f540 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1f550 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
1f560 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1f570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1f580 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
1f590 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1f5a0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1f5b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
1f5c0 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  16(zFilename, &d
1f5d0 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1f5e0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1f5f0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1f600 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1f610 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1f620 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f630 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1f640 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1f650 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1f660 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f680 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  : sqlite3_comple
1f690 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72  te16 <UTF-16 str
1f6a0 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ing>.**.** Retur
1f6b0 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c  n 1 if the suppl
1f6c0 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ied argument is 
1f6d0 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
1f6e0 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72  tatement, or zer
1f6f0 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  o.** otherwise..
1f700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1f710 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1f720 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76  _complete16(.  v
1f730 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f740 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f750 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f760 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f770 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1f780 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1f790 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
1f7a0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1f7b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
1f7c0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
1f7d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1f7e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1f7f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1f800 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20   objv, "<utf-16 
1f810 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75  sql>");.    retu
1f820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f830 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61  }..  zBuf = (cha
1f840 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
1f850 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
1f860 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65  1], 0);.  Tcl_Se
1f870 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1f880 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1f890 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74  (sqlite3_complet
1f8a0 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e  e16(zBuf)));.#en
1f8b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f8c0 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53  IT_COMPLETE && S
1f8d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1f8e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1f8f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f900 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 72  age: sqlite3_nor
1f910 6d 61 6c 69 7a 65 20 53 51 4c 0a 2a 2a 0a 2a 2a  malize SQL.**.**
1f920 20 52 65 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d   Return the norm
1f930 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 66 6f 72  alized value for
1f940 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
1f950 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1f960 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1f970 65 73 74 5f 6e 6f 72 6d 61 6c 69 7a 65 28 0a 20  est_normalize(. 
1f980 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f990 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f9a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f9b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f9c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f9d0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1f9e0 20 63 68 61 72 20 2a 7a 4e 6f 72 6d 3b 0a 20 20   char *zNorm;.  
1f9f0 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c  extern char *sql
1fa00 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63  ite3_normalize(c
1fa10 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20  onst char*);..  
1fa20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1fa30 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1fa40 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1fa50 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
1fa60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa70 52 3b 0a 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d  R;.  }..  zSql =
1fa80 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 53   (char*)Tcl_GetS
1fa90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
1faa0 20 20 7a 4e 6f 72 6d 20 3d 20 73 71 6c 69 74 65    zNorm = sqlite
1fab0 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 7a 53 71 6c  3_normalize(zSql
1fac0 29 3b 0a 20 20 69 66 28 20 7a 4e 6f 72 6d 20 29  );.  if( zNorm )
1fad0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1fae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1faf0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1fb00 7a 4e 6f 72 6d 2c 20 2d 31 29 29 3b 0a 20 20 20  zNorm, -1));.   
1fb10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
1fb20 6f 72 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  orm);.  }.  retu
1fb30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1fb40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1fb50 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a  e3_step STMT.**.
1fb60 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73  ** Advance the s
1fb70 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
1fb80 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  next row..*/.sta
1fb90 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1fba0 43 4c 41 50 49 20 74 65 73 74 5f 73 74 65 70 28  CLAPI test_step(
1fbb0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fbc0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fbd0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fbe0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fbf0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fc00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1fc10 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1fc20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1fc30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1fc40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1fc50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1fc60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1fc70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1fc80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1fc90 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
1fca0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fcb0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1fcc0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1fcd0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1fce0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1fcf0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1fd00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1fd10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1fd20 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20  tmt);..  /* if( 
1fd30 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1fd40 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
1fd50 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  W ) return TCL_E
1fd60 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53  RROR; */.  Tcl_S
1fd70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1fd80 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1fd90 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1fda0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1fdb0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
1fdc0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1fdd0 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
1fde0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1fdf0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1fe00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1fe10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1fe20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1fe30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1fe40 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1fe50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1fe60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1fe70 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
1fe80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1fe90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1fea0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1feb0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1fec0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1fed0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1fee0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1fef0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1ff00 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
1ff10 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54  e3_sql(pStmt), T
1ff20 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
1ff30 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ff40 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1ff50 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65  TE_TCLAPI test_e
1ff60 78 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20  x_sql(.  void * 
1ff70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ff80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ff90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ffa0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ffb0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1ffc0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1ffd0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
1ffe0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1fff0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
20000 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
20010 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
20020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20030 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
20040 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
20050 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
20060 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
20070 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
20080 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
20090 6c 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73  lite3_expanded_s
200a0 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ql(pStmt);.  Tcl
200b0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
200c0 70 2c 20 7a 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  p, z, TCL_VOLATI
200d0 4c 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  LE);.  sqlite3_f
200e0 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
200f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20100 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20110 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
20120 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
20130 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
20140 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
20150 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
20160 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
20170 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
20180 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75  TCLAPI test_colu
20190 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
201a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
201b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
201c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
201d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
201e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
201f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
20200 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
20210 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
20220 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
20230 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
20240 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
20250 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
20260 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
20270 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
20280 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20290 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
202a0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
202b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
202c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
202d0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
202e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
202f0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
20300 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
20310 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
20320 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
20330 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
20340 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
20350 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
20360 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
20370 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
20380 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
20390 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
203a0 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
203b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
203c0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
203d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
203e0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  est_column_type(
203f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20400 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20410 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20420 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20430 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20440 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
20450 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
20460 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a  col;.  int tp;..
20470 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
20480 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20490 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
204a0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
204b0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
204c0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
204d0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
204e0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
204f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20500 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
20510 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
20520 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20530 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20540 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
20550 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
20560 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
20570 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
20580 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
20590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
205a0 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63    tp = sqlite3_c
205b0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
205c0 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68  , col);.  switch
205d0 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( tp ){.    case
205e0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
205f0 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52   .      Tcl_SetR
20600 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
20610 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41  NTEGER", TCL_STA
20620 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
20630 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
20640 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  ITE_NULL:.      
20650 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
20660 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43  terp, "NULL", TC
20670 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
20680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
20690 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a  e SQLITE_FLOAT:.
206a0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
206b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f  ult(interp, "FLO
206c0 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  AT", TCL_STATIC)
206d0 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
206e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
206f0 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  TEXT:.      Tcl_
20700 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
20710 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54  , "TEXT", TCL_ST
20720 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
20730 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
20740 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  LITE_BLOB:.     
20750 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
20760 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54  nterp, "BLOB", T
20770 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
20780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
20790 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
207a0 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72  ert(0);.  }..  r
207b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
207c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
207d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
207e0 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  64 STMT column.*
207f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20800 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
20810 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
20820 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20  urrent row cast 
20830 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36  as an.** wide (6
20840 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a  4-bit) integer..
20850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
20860 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
20870 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20  _column_int64(. 
20880 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20890 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
208a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
208b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
208c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
208d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
208e0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
208f0 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a  l;.  i64 iVal;..
20900 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
20910 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20920 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
20930 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20940 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
20950 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
20960 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
20970 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
20980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20990 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
209a0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
209b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
209c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
209d0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
209e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
209f0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
20a00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
20a10 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
20a20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
20a30 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    iVal = sqlite3
20a40 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
20a50 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
20a60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20a70 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
20a80 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a  eIntObj(iVal));.
20a90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20ab0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
20ac0 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  blob STMT column
20ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
20ae0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
20af0 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20  t_column_blob(. 
20b00 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20b10 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20b20 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20b30 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20b40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20b50 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20b60 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
20b70 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  l;..  int len;. 
20b80 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
20b90 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ob;..  if( objc!
20ba0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
20bb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
20bc0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
20bd0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
20be0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
20bf0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
20c00 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
20c10 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
20c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
20c30 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
20c40 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
20c50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20c60 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
20c70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20c80 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
20c90 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
20ca0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
20cb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20cc0 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  OR;..  len = sql
20cd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
20ce0 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  s(pStmt, col);. 
20cf0 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
20d00 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
20d10 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
20d20 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20d30 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
20d40 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20  ArrayObj(pBlob, 
20d50 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  len));.  return 
20d60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20d70 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
20d80 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54  column_double ST
20d90 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
20da0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
20db0 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
20dc0 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
20dd0 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20  t row cast as a 
20de0 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
20df0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
20e00 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  API test_column_
20e10 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
20e20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
20e30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20e40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
20e50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20e60 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
20e70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
20e80 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
20e90 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
20ea0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
20eb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
20ec0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
20ed0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
20ee0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
20ef0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20f00 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
20f10 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
20f20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20f30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
20f40 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
20f50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
20f60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
20f70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
20f80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
20f90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
20fa0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
20fb0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
20fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
20fd0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
20fe0 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
20ff0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
21000 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
21010 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
21020 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
21030 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21040 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
21050 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
21060 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
21070 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
21080 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
21090 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
210a0 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
210b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
210c0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61  E_TCLAPI test_da
210d0 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  ta_count(.  void
210e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
210f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21100 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21110 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21120 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
21130 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21140 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
21150 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
21160 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
21170 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
21180 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
21190 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
211a0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
211b0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
211c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
211d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
211e0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
211f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
21200 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
21210 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
21220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21230 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
21240 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
21250 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
21260 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74  3_data_count(pSt
21270 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
21280 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21290 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
212a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54  column_text STMT
212b0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
212c0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
212d0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d  umn_decltype STM
212e0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
212f0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
21300 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63  lumn_name STMT c
21310 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
21320 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
21330 49 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  I test_stmt_utf8
21340 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
21350 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
21360 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
21370 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
21380 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
21390 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
213a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
213b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
213c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
213d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
213e0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
213f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
21400 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
21410 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e  mt*, int);.  con
21420 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
21430 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
21440 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74   char *(*)(sqlit
21450 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
21460 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
21470 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
21480 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
21490 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
214a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
214b0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
214c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
214d0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
214e0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
214f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21500 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
21510 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
21520 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
21530 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
21540 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
21550 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
21560 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
21570 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
21580 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
21590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
215a0 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
215b0 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
215c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
215d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
215e0 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
215f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
21600 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
21610 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
21620 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
21630 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
21640 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
21650 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21660 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
21670 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21680 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
21690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
216a0 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
216b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
216c0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
216d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
216e0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
216f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21700 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
21710 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
21720 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
21730 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
21740 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
21750 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
21760 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
21770 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
21780 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
21790 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
217a0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
217b0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
217c0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
217d0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
217e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
217f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
21800 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
21810 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
21820 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
21830 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20  t_utf16(.  void 
21840 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
21850 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
21860 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
21870 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
21880 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
21890 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
218a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
218b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
218c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
218d0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
218e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
218f0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
21900 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
21910 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
21920 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  me16;.  const vo
21930 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c  id *(*xFunc)(sql
21940 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
21950 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
21960 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71  nst void *(*)(sq
21970 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
21980 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
21990 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
219a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
219b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
219c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
219d0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
219e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
219f0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
21a00 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
21a10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21a20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
21a30 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
21a40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
21a50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
21a60 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
21a70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21a80 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21a90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
21aa0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
21ab0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
21ac0 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28  zName16 = xFunc(
21ad0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
21ae0 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20  f( zName16 ){.  
21af0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e    int n;.    con
21b00 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61  st char *z = zNa
21b10 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  me16;.    for(n=
21b20 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31  0; z[n] || z[n+1
21b30 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70  ]; n+=2){}.    p
21b40 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Ret = Tcl_NewByt
21b50 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31  eArrayObj(zName1
21b60 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c  6, n+2);.    Tcl
21b70 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21b80 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
21b90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21ba0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
21bb0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
21bd0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
21be0 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  _int STMT column
21bf0 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
21c00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
21c10 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  es STMT column.*
21c20 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
21c30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
21c40 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  16 STMT column.*
21c50 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
21c60 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
21c70 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76  st_stmt_int(.  v
21c80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21c90 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ,    /* Pointer 
21ca0 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
21cb0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
21cc0 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
21cd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
21ce0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
21cf0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21d00 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
21d10 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
21d20 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78  t col;.  int (*x
21d30 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
21d40 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
21d50 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73  unc = (int (*)(s
21d60 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
21d70 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
21d80 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
21d90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
21da0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
21db0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
21dc0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
21dd0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
21de0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
21df0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
21e00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21e10 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
21e20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
21e30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
21e40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
21e50 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
21e60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
21e70 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
21e80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
21e90 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
21ea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
21eb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
21ec0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
21ed0 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53  wIntObj(xFunc(pS
21ee0 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72  tmt, col)));.  r
21ef0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
21f00 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
21f10 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
21f20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45   DB  MAGIC-NUMBE
21f30 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  R.**.** Set the 
21f40 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e  db->magic value.
21f50 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
21f60 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63  o test error rec
21f70 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  overy logic..*/.
21f80 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
21f90 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f  E_TCLAPI sqlite_
21fa0 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69  set_magic(.  voi
21fb0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
21fc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21fd0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
21fe0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
21ff0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22000 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
22010 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22020 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22030 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
22040 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
22050 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
22060 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b  " DB MAGIC", 0);
22070 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22080 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22090 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
220a0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
220b0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
220c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74  _ERROR;.  if( st
220d0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
220e0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
220f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
22100 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
22110 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65  MAGIC_OPEN;.  }e
22120 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
22130 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
22140 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d  MAGIC_CLOSED")==
22150 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
22160 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
22170 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73  C_CLOSED;.  }els
22180 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
22190 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
221a0 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b  GIC_BUSY")==0 ){
221b0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
221c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
221d0 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SY;.  }else if( 
221e0 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
221f0 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52  "SQLITE_MAGIC_ER
22200 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ROR")==0 ){.    
22210 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
22220 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
22230 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f    }else if( Tcl_
22240 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
22250 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64  rgv[2], (int*)&d
22260 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20  b->magic) ){.   
22270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22280 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
22290 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
222a0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
222b0 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a  _interrupt  DB .
222c0 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e  **.** Trigger an
222d0 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42   interrupt on DB
222e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
222f0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
22300 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76  t_interrupt(.  v
22310 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
22320 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
22330 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
22340 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
22350 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
22360 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
22370 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
22380 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22390 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
223a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
223b0 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20  argv[0], " DB", 
223c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
223d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
223e0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
223f0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
22400 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
22410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
22420 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
22430 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
22440 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
22450 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
22460 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66  te_function DB f
22470 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a  unction-name.**.
22480 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73  ** Delete the us
22490 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e  er function 'fun
224a0 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ction-name' from
224b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
224c0 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73   DB. It.** is as
224d0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75  sumed that the u
224e0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ser function was
224f0 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
22500 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a  , any number of.
22510 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68  ** arguments (th
22520 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  e way the TCL in
22530 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
22540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22550 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65  SQLITE_TCLAPI de
22560 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  lete_function(. 
22570 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
22580 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
22590 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
225a0 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
225b0 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
225c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
225d0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
225e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
225f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22600 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22610 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
22620 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
22630 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
22640 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
22650 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22660 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
22670 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
22680 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
22690 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
226a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
226b0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
226c0 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
226d0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
226e0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
226f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
22700 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
22710 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
22720 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
22730 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22740 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65  Usage: sqlite_de
22750 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44  lete_collation D
22760 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65  B collation-name
22770 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
22780 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22790 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d  ence 'collation-
227a0 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62  name' from datab
227b0 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44  ase handle .** D
227c0 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  B. It is assumed
227d0 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74   that the collat
227e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
227f0 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
22800 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68   (the .** way th
22810 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20  e TCL interface 
22820 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61  does it)..*/.sta
22830 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
22840 43 4c 41 50 49 20 64 65 6c 65 74 65 5f 63 6f 6c  CLAPI delete_col
22850 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
22860 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
22870 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22880 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
22890 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
228a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
228b0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
228c0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
228d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
228e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
228f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
22900 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
22910 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
22920 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
22930 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22940 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
22950 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
22960 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
22970 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
22980 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
22990 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
229a0 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
229b0 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
229c0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
229d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
229e0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
229f0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
22a00 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
22a10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22a20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
22a30 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
22a40 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
22a50 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
22a60 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
22a70 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
22a80 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
22a90 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
22aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
22ab0 4c 49 54 45 5f 54 43 4c 41 50 49 20 67 65 74 5f  LITE_TCLAPI get_
22ac0 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f  autocommit(.  vo
22ad0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22ae0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22af0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22b00 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22b10 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  .){.  char zBuf[
22b20 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  30];.  sqlite3 *
22b30 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
22b40 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
22b50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22b60 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
22b70 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
22b80 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
22b90 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
22ba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22bb0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22bc0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22bd0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
22be0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
22bf0 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  OR;.  sqlite3_sn
22c00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
22c10 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
22c20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
22c30 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20  ocommit(db));.  
22c40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22c50 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
22c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
22c70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
22c80 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ge: sqlite3_busy
22c90 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a  _timeout DB MS.*
22ca0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
22cb0 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73  y timeout.  This
22cc0 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   is more easily 
22cd0 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74  done using the t
22ce0 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64  imeout.** method
22cf0 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65   of the TCL inte
22d00 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e  rface.  But we n
22d10 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73  eed a way to tes
22d20 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  t the case.** wh
22d30 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53  ere it returns S
22d40 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f  QLITE_MISUSE..*/
22d50 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
22d60 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
22d70 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76  usy_timeout(.  v
22d80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
22d90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
22da0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
22db0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
22dc0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d  v.){.  int rc, m
22dd0 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s;.  sqlite3 *db
22de0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
22df0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22e00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22e10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
22e20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
22e30 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
22e40 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
22e50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22e70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22e80 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
22e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22ea0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
22eb0 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
22ec0 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
22ed0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
22ee0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79  c = sqlite3_busy
22ef0 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29  _timeout(db, ms)
22f00 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
22f10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
22f20 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
22f30 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
22f40 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
22f50 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61  sage:  tcl_varia
22f60 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c  ble_type VARIABL
22f70 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ENAME.**.** Retu
22f80 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
22f90 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
22fa0 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
22fb0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  he.** value of t
22fc0 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c  he given variabl
22fd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22fe0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
22ff0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
23000 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
23010 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
23020 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
23030 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
23040 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23050 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
23060 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
23070 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
23080 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
23090 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
230a0 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
230b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
230c0 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
230d0 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
230e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
230f0 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
23100 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
23110 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
23120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23130 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
23140 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
23150 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
23160 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
23170 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
23180 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
23190 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
231a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
231b0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
231c0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
231d0 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ?N?.**.** Attemp
231e0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
231f0 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
23200 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ld but not actua
23210 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  lly required..**
23220 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69   The integer N i
23230 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
23240 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79  bytes we are try
23250 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20  ing to release. 
23260 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20   The .** return 
23270 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f  value is the amo
23280 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63  unt of memory ac
23290 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e  tually released.
232a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
232b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
232c0 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
232d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
232e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
232f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
23300 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
23310 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23320 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
23330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
23340 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29  MORY_MANAGEMENT)
23350 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
23360 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
23370 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
23380 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
23390 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
233a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
233b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
233c0 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
233d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
233e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
233f0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
23400 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
23410 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23420 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
23430 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23440 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31  else{.    N = -1
23450 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
23460 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
23470 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  mory(N);.  Tcl_S
23480 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
23490 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
234a0 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a  j(amt));.#endif.
234b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
234c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
234d0 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  :  sqlite3_db_re
234e0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a  lease_memory DB.
234f0 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
23500 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   release memory 
23510 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
23520 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20  y database DB.  
23530 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65  Return the.** re
23540 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68  sult code (which
23550 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
23560 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
23570 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a  s always zero)..
23580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
23590 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
235a0 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
235b0 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ry(.  void * cli
235c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
235d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
235e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
235f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
23600 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
23610 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
23620 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
23630 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
23640 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
23650 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
23660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23670 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23680 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23690 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
236a0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
236b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
236c0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
236d0 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
236e0 6f 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  ory(db);.  Tcl_S
236f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
23700 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
23710 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
23720 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
23730 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
23740 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 20  3_db_cacheflush 
23750 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  DB.**.** Attempt
23760 20 74 6f 20 66 6c 75 73 68 20 61 6e 79 20 64 69   to flush any di
23770 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73  rty pages to dis
23780 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
23790 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
237a0 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73  est_db_cacheflus
237b0 68 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  h(.  void * clie
237c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
237d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
237e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
237f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
23800 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
23810 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23820 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
23830 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
23840 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
23850 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
23860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
23880 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23890 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
238a0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
238b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
238c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
238d0 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64  _db_cacheflush(d
238e0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
238f0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
23900 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
23910 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
23920 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
23930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54  _ERROR;.  }..  T
23950 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
23960 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
23970 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
23980 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
23990 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44  3_system_errno D
239a0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
239b0 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73  he low-level sys
239c0 74 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e  tem errno value.
239d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
239e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
239f0 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a  t_system_errno(.
23a00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
23a10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
23a20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
23a30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
23a40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
23a50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
23a60 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20  .  int iErrno;. 
23a70 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
23a80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
23a90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
23aa0 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
23ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23ac0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23ad0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23ae0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23af0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
23b00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23b10 52 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71  R;.  iErrno = sq
23b20 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
23b30 6e 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  no(db);.  Tcl_Se
23b40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23b50 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23b60 28 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74  (iErrno));.  ret
23b70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
23b80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
23b90 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
23ba0 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
23bb0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
23bc0 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63   of a file assoc
23bd0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
23be0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
23bf0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23c00 50 49 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e  PI test_db_filen
23c10 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
23c20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
23c30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
23c40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
23c50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
23c60 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
23c70 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
23c80 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
23c90 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
23ca0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
23cb0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
23cc0 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
23cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23ce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
23cf0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
23d00 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
23d10 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
23d20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
23d30 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
23d40 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
23d50 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
23d60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23d70 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64  nterp, sqlite3_d
23d80 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a  b_filename(db, z
23d90 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29  DbName), (void*)
23da0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23db0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23dc0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
23dd0 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e  _readonly DB DBN
23de0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
23df0 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d   1 or 0 if DBNAM
23e00 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72  E is readonly or
23e10 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31   not.  Return -1
23e20 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a   if DBNAME does.
23e30 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  ** not exist..*/
23e40 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
23e50 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
23e60 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f  b_readonly(.  vo
23e70 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
23e80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23e90 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
23ea0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
23eb0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
23ec0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
23ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
23ee0 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  me;.  if( objc!=
23ef0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
23f00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
23f10 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
23f20 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
23f30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23f40 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23f50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
23f60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23f70 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
23f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23f90 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
23fa0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
23fb0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
23fc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23fd0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
23fe0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
23ff0 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a  db, zDbName)));.
24000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
24020 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
24030 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a  eap_limit ?N?.**
24040 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74  .** Query or set
24050 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c   the soft heap l
24060 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72  imit for the cur
24070 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68  rent thread.  Th
24080 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e  e.** limit is on
24090 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  ly changed if th
240a0 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20  e N is present. 
240b0 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   The previous li
240c0 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  mit.** is return
240d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
240e0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
240f0 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
24100 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  imit(.  void * c
24110 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
24120 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24130 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
24140 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24150 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
24160 33 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54  3_int64 amt;.  T
24170 63 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d  cl_WideInt N = -
24180 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  1;.  if( objc!=1
24190 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
241a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
241b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
241c0 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20  bjv, "?N?");.   
241d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
241e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
241f0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
24200 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
24210 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
24220 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
24230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24240 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74   }.  amt = sqlit
24250 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
24260 69 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  it64(N);.  Tcl_S
24270 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
24280 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
24290 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72  ntObj(amt));.  r
242a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
242b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
242c0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
242d0 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c  leanup.**.** Cal
242e0 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68  l the sqlite3_th
242f0 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49  read_cleanup API
24300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24310 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
24320 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  st_thread_cleanu
24330 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
24340 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
24350 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
24360 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
24370 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24380 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
24390 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
243a0 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68  TED.  sqlite3_th
243b0 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a  read_cleanup();.
243c0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
243d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
243e0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
243f0 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
24400 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  s  DB.**.** Retu
24410 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d  rn a list of num
24420 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74  bers which are t
24430 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74  he PagerRefcount
24440 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65   for all.** page
24450 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62  rs on each datab
24460 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
24470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
24480 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
24490 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
244a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
244b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
244c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
244d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
244e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
244f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24500 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
24510 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f  t v, *a;.  Tcl_O
24520 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20  bj *pResult;..  
24530 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
24540 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
24550 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
24560 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
24570 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
24580 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
24590 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
245a0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
245b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
245c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
245d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
245e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
245f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
24600 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24610 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d  ROR;.  pResult =
24620 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
24630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
24640 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
24650 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
24660 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  t==0 ){.      v 
24670 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
24680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
24690 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
246a0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d  utex);.      a =
246b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61   sqlite3PagerSta
246c0 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
246d0 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  ager(db->aDb[i].
246e0 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d  pBt));.      v =
246f0 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c   a[0];.      sql
24700 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
24710 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
24720 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
24730 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
24740 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
24750 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
24760 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
24770 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
24780 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
24790 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
247a0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
247b0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
247c0 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
247d0 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
247e0 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
247f0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
24800 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
24810 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
24820 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
24830 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
24840 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
24850 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
24860 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
24870 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
24880 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
24890 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
248a0 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
248b0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
248c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
248d0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
248e0 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
248f0 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
24900 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
24910 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
24920 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
24930 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
24940 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
24950 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
24960 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
24970 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
24980 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
24990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
249a0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f  SQLITE_TCLAPI wo
249b0 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
249c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
249d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
249e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
249f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24a00 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24a10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
24a20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
24a30 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
24a40 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24a50 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a70 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24a80 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24a90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24aa0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24ab0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
24ac0 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
24ad0 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
24ae0 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
24af0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
24b00 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
24b10 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
24b20 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
24b30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
24b40 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
24b50 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
24b60 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
24b70 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
24b80 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
24b90 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
24ba0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
24bb0 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
24bc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
24bd0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
24be0 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
24bf0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
24c00 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
24c10 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
24c20 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
24c30 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
24c40 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
24c50 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
24c60 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
24c70 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
24c80 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
24c90 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
24ca0 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
24cb0 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
24cc0 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
24cd0 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
24ce0 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
24cf0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
24d00 41 50 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74  API vfs_unlink_t
24d10 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
24d20 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24d30 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24d40 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24d50 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24d60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24d70 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24d80 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24d90 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24da0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
24db0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
24dc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
24dd0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
24de0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24df0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24e00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24e10 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
24e20 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20  3_vfs *pMain;.  
24e30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
24e40 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65  fs[20];.  sqlite
24e50 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a  3_vfs one, two;.
24e60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
24e70 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20  nregister(0);   
24e80 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66  /* Unregister of
24e90 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73   NULL is harmles
24ea0 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  s */.  one.zName
24eb0 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77   = "__one";.  tw
24ec0 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f  o.zName = "__two
24ed0 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  ";..  /* Calling
24ee0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
24ef0 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61  ister with 2nd a
24f00 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65  rgument of 0 doe
24f10 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67  s not.  ** chang
24f20 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  e the default VF
24f30 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d  S.  */.  pMain =
24f40 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
24f50 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  d(0);.  sqlite3_
24f60 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
24f70 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 0);.  assert(
24f80 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
24f90 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
24fa0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c  find(0) );.  sql
24fb0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
24fc0 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73  r(&two, 0);.  as
24fd0 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
24fe0 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
24ff0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
25000 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e  .  /* We can fin
25010 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e  d a VFS by its n
25020 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ame */.  assert(
25030 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25040 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
25050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25060 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
25070 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
25080 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
25090 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74  qlite_vfs_regist
250a0 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f  er with non-zero
250b0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
250c0 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20  r changes the.  
250d0 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20  ** default VFS, 
250e0 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20  even if the 1st 
250f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
25100 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74  existig VFS that
25110 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75   is.  ** previou
25120 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61  sly registered a
25130 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c  s the non-defaul
25140 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
25150 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
25160 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  one, 1);.  asser
25170 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
25180 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
25190 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
251a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
251b0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
251c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
251d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
251e0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69  ==&one );.  sqli
251f0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
25200 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73  (&two, 1);.  ass
25210 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
25220 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
25230 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
25240 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
25250 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
25260 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
25270 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
25280 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66  0)==&two );.  if
25290 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73  ( pMain ){.    s
252a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
252b0 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20  ter(pMain, 1);. 
252c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
252d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
252e0 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
252f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25300 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
25310 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20  o")==&two );.   
25320 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25330 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
25340 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ain );.  }.  .  
25350 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65  /* Unlink the de
25360 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65  fault VFS.  Repe
25370 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  at until there a
25380 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73  re no more VFSes
25390 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64  .  ** registered
253a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
253b0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73  ; i<sizeof(apVfs
253c0 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
253d0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  ]); i++){.    ap
253e0 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
253f0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
25400 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
25410 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25420 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
25430 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
25440 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
25450 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
25460 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
25470 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  s[i]);.      ass
25480 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
25490 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
254a0 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
254b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
254c0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
254d0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20  find(0) );.  .  
254e0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
254f0 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d  main VFS as non-
25500 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65  default (will be
25510 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73   made default, s
25520 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20  ince.  ** it'll 
25530 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  be the only one 
25540 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20  in existence).. 
25550 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
25560 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
25570 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
25580 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25590 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
255a0 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65  .  /* Un-registe
255b0 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61  r the main VFS a
255c0 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20  gain to restore 
255d0 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73  an empty VFS lis
255e0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
255f0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d  fs_unregister(pM
25600 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ain);.  assert( 
25610 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
25620 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
25630 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73  Relink all VFSes
25640 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
25650 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d  r. */  .  for(i=
25660 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
25670 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31  zeof(apVfs[0])-1
25680 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
25690 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
256a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
256b0 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
256c0 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  fs[i], 1);.     
256d0 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
256e0 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
256f0 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20  ind(0) );.      
25700 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
25710 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
25720 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
25730 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
25740 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
25750 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53  r out sample VFS
25760 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
25770 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
25780 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  &one);.  sqlite3
25790 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
257a0 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72  &two);..  /* Unr
257b0 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53  egistering a VFS
257c0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72   that is not cur
257d0 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65  rently registere
257e0 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  d is harmless */
257f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
25800 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
25810 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
25820 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
25830 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25840 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
25850 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ne")==0 );.  ass
25860 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
25870 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
25880 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68  0 );..  /* We sh
25890 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74  ould be left wit
258a0 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
258b0 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20  efault VFS back 
258c0 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  as the.  ** orig
258d0 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  inal */.  assert
258e0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
258f0 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
25900 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
25920 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69  d:   vfs_initfai
25930 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  l_test.**.** Thi
25940 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74  s TCL command at
25950 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69  tempts to vfs_fi
25960 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73  nd and vfs_regis
25970 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ter when the.** 
25980 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
25990 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69  ze() interface i
259a0 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20  s failing.  All 
259b0 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69  calls should fai
259c0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
259d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76   SQLITE_TCLAPI v
259e0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
259f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25a00 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25a10 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25a20 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25a30 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25a40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25a50 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25a60 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25a70 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
25a80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25aa0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
25ab0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
25ac0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25ad0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25ae0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25af0 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20  lite3_vfs one;. 
25b00 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
25b10 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c  one";..  if( sql
25b20 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
25b30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
25b40 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
25b50 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
25b60 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
25b70 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
25b80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25b90 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
25ba0 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
25bb0 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   1);.  if( sqlit
25bc0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
25bd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25be0 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
25bf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  OK;.}../*.** Sav
25c00 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74  ed VFSes.*/.stat
25c10 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
25c20 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69  apVfs[20];.stati
25c30 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a  c int nVfs = 0;.
25c40 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
25c50 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
25c60 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69  all.**.** Unregi
25c70 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a  ster all VFSes..
25c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25c90 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f  LITE_TCLAPI vfs_
25ca0 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  unregister_all(.
25cb0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25cc0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25cd0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25ce0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25cf0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25d00 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25d10 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25d20 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25d30 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25d40 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25d60 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25d70 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25d80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25d90 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25da0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
25db0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
25dc0 41 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29  ArraySize(apVfs)
25dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
25de0 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
25df0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
25e00 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20  if( apVfs[i]==0 
25e10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
25e20 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
25e30 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20  ter(apVfs[i]);. 
25e40 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20   }.  nVfs = i;. 
25e50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
25e60 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
25e70 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
25e80 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f  _all.**.** Resto
25e90 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61  re all VFSes tha
25ea0 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75  t were removed u
25eb0 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73  sing vfs_unregis
25ec0 74 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a  ter_all. Taking.
25ed0 2a 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74  ** care to put t
25ee0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62  he linked list b
25ef0 61 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20  ack together in 
25f00 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
25f10 73 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62  s it was.** in b
25f20 65 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69  efore vfs_unregi
25f30 73 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76  ster_all was inv
25f40 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
25f50 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
25f60 49 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72  I vfs_reregister
25f70 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
25f80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25f90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25fa0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25fb0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25fc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25fd0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25fe0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25ff0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26000 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26010 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26030 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26040 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26050 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26060 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26070 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
26080 3d 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nVfs-1; i>=0; i
26090 2d 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  --){.    sqlite3
260a0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70  _vfs_register(ap
260b0 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a  Vfs[i], 1);.  }.
260c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
260d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
260e0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
260f0 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  l_test DB.**.** 
26100 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
26110 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
26120 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
26130 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
26140 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
26150 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
26160 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
26170 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
26180 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
26190 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
261a0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
261b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
261c0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
261d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
261e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
261f0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
26200 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
26210 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
26220 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26230 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
26240 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26250 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
26260 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
26270 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
26280 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
26290 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b  .  int iArg = 0;
262a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
262b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
262c0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
262d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
262e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
262f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
26300 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
26310 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
26320 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
26330 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
26340 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26350 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26360 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26370 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26380 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
26390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
263a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
263b0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
263c0 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a  , 0, 0, &iArg);.
263d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
263e0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
263f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26400 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
26410 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c   "notadatabase",
26420 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
26430 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b  CKSTATE, &iArg);
26440 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
26450 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
26460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
26470 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
26480 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67  main", -1, &iArg
26490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
264a0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
264b0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
264c0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
264d0 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20  db, "temp", -1, 
264e0 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
264f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
26500 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c  FOUND || rc==SQL
26510 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
26520 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26530 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
26540 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
26550 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44  lasterrno_test D
26560 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
26570 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
26580 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
26590 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
265a0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
265b0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
265c0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
265d0 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62  _LAST_ERRNO verb
265e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
265f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
26600 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
26610 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69  rrno_test(.  Cli
26620 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26630 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
26640 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
26650 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
26660 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26670 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26680 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26690 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
266a0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
266b0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
266c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
266d0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
266e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
266f0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26700 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26710 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
26720 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
26730 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
26740 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
26750 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
26760 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
26770 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
26780 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
26790 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
267a0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
267b0 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
267c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
267d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
267e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
267f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
26800 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
26810 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26820 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
26840 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
26850 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54  ULL, SQLITE_LAST
26860 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a  _ERRNO, &iArg);.
26870 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20    if( rc ){ .   
26880 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
26890 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
268a0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20  wIntObj(rc)); . 
268b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
268c0 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20  ROR; .  }.  if( 
268d0 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20  iArg!=0 ) {.    
268e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
268f0 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65  (interp, "Unexpe
26900 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72  cted non-zero er
26910 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  rno: ",.        
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
26930 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
26940 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  j(Tcl_NewIntObj(
26950 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20  iArg), 0), " ", 
26960 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
26970 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26980 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
26990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
269a0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
269b0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20  _chunksize_test 
269c0 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a  DB DBNAME SIZE.*
269d0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
269e0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
269f0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
26a00 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
26a10 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
26a20 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
26a30 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45  of the SQLITE_GE
26a40 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
26a50 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45  and.** SQLITE_SE
26a60 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
26a70 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  verbs..*/.static
26a80 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
26a90 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
26aa0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a  chunksize_test(.
26ab0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26ac0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26ad0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26ae0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
26af0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
26b00 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26b10 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26b20 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26b30 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26b40 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26b60 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26b70 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26b80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26b90 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26ba0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
26bb0 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26bd0 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f  ew chunk size */
26be0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22     /* Db name ("
26c10 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
26c20 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  c.) */.  sqlite3
26c30 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
26c40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26c50 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
26c60 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   /* file_control
26c90 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
26ca0 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  /..  if( objc!=4
26cb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
26cc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
26cd0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
26ce0 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20  NAME SIZE");.   
26cf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26d00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
26d10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
26d20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
26d30 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a  objv[1]), &db) .
26d40 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74     || Tcl_GetInt
26d50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
26d60 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29  objv[3], &nSize)
26d70 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  .  ){.   return 
26d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26d90 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
26da0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
26db0 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30   if( zDb[0]=='\0
26dc0 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a  ' ) zDb = NULL;.
26dd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26de0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
26df0 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e   zDb, SQLITE_FCN
26e00 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28  TL_CHUNK_SIZE, (
26e10 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
26e20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26e30 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
26e40 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
26e50 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
26e60 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
26e70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26e80 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
26e90 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
26ea0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
26eb0 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
26ec0 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d  nt_test DB DBNAM
26ed0 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69  E SIZE.**.** Thi
26ee0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
26ef0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
26f00 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
26f10 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20 53  rface .** with S
26f20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
26f30 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20  _HINT.*/.static 
26f40 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
26f50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73  I file_control_s
26f60 69 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20  izehint_test(.  
26f70 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26f80 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
26f90 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
26fa0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
26fb0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
26fc0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
26fd0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
26fe0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
26ff0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27000 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27020 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27030 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27040 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27050 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27060 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69  s */.){.  Tcl_Wi
27070 64 65 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20  deInt nSize;    
27080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
27090 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68  ted size */.  ch
270a0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
270c0 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22   Db name ("main"
270d0 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a  , "temp" etc.) *
270e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27110 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
27120 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
27140 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65  ile_control() re
27150 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27160 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
27170 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
27180 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
27190 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20  bjv, "DB DBNAME 
271a0 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75  SIZE");.    retu
271b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
271c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
271d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
271e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
271f0 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c  1]), &db) .   ||
27200 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
27210 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
27220 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a  bjv[3], &nSize).
27230 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54    ){.   return T
27240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27250 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
27260 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
27270 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27  if( zDb[0]=='\0'
27280 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a   ) zDb = NULL;..
27290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
272a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
272b0 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
272c0 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f  L_SIZE_HINT, (vo
272d0 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20  id *)&nSize);.  
272e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
272f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
27300 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
27310 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
27320 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
27330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27340 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
27350 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
27360 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
27370 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
27380 79 5f 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a  y_test DB PWD.**
27390 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
273a0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
273b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
273c0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
273d0 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
273e0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
273f0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
27400 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
27410 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
27420 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
27430 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
27440 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
27450 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  I file_control_l
27460 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20  ockproxy_test(. 
27470 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
27480 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
27490 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
274a0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
274b0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
274c0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
274d0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
274e0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
274f0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27500 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27520 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27530 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
27540 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
27550 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
27560 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
27570 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28  e3 *db;.  .  if(
27580 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
27590 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
275a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
275b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
275c0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
275d0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
275e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
275f0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
27600 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20  DB PWD", 0);.   
27610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27620 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
27630 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
27640 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
27650 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
27660 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
27670 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69  ERROR;.  }.  .#i
27680 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
27690 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
276a0 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
276b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
276c0 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
276d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
276e0 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
276f0 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
27700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27710 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
27720 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
27730 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
27740 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
27750 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27760 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  _).  {.    char 
27770 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69  *testPath;.    i
27780 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  nt rc;.    int n
27790 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Pwd;.    const c
277a0 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63  har *zPwd;.    c
277b0 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30  har proxyPath[40
277c0 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77  0];.    .    zPw
277d0 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
277e0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
277f0 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66  , &nPwd);.    if
27800 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  ( sizeof(proxyPa
27810 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20  th)<nPwd+20 ){. 
27820 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
27830 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50  esult(interp, "P
27840 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f  WD too big", (vo
27850 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  id*)0);.      re
27860 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27870 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
27880 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
27890 66 28 70 72 6f 78 79 50 61 74 68 29 2c 20 70 72  f(proxyPath), pr
278a0 6f 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73  oxyPath, "%s/tes
278b0 74 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b  t.proxy", zPwd);
278c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
278d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
278e0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
278f0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
27900 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
27910 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27920 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
27930 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
27940 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20  NewIntObj(rc)); 
27950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
27960 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
27970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27980 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
27990 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45   NULL, SQLITE_GE
279a0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
279b0 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20   &testPath);.   
279c0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f   if( strncmp(pro
279d0 78 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c  xyPath,testPath,
279e0 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  11) ){.      Tcl
279f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
27a00 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78  terp, "Lock prox
27a10 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d  y file did not m
27a20 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20  atch the ".     
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69            "previ
27a50 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76  ously assigned v
27a60 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  alue", 0);.     
27a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27a80 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
27a90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
27aa0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
27ab0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
27ac0 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20  Obj(rc));.      
27ad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
27b00 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
27b10 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
27b20 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
27b30 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
27b40 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
27b50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
27b60 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
27b70 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
27b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27b90 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
27ba0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27bb0 20 20 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45    .}..#if SQLITE
27bc0 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63  _OS_WIN./*.** tc
27bd0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
27be0 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
27bf0 74 72 79 20 44 42 20 20 4e 52 45 54 52 59 20 20  try DB  NRETRY  
27c00 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73  DELAY.**.** This
27c10 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
27c20 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
27c30 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
27c40 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65  face with.** the
27c50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
27c60 4e 33 32 5f 41 56 5f 52 45 54 52 59 20 6f 70 63  N32_AV_RETRY opc
27c70 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
27c80 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
27c90 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
27ca0 6e 33 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20  n32_av_retry(.  
27cb0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27cc0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
27cd0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
27ce0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
27cf0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27d00 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27d10 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27d20 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27d30 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27d40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27d60 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27d70 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27d80 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27d90 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27da0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
27db0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
27dc0 0a 20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63  .  int a[2];.  c
27dd0 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
27de0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
27df0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
27e00 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
27e10 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
27e20 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
27e30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
27e40 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
27e50 29 2c 20 22 20 44 42 20 4e 52 45 54 52 59 20 44  ), " DB NRETRY D
27e60 45 4c 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72  ELAY", 0);.    r
27e70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27e80 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
27e90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
27ea0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27eb0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
27ec0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27ed0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
27ee0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
27ef0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
27f00 5d 2c 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75  ], &a[0]) ) retu
27f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27f20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
27f30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
27f40 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20  jv[3], &a[1]) ) 
27f50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27f60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27f70 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
27f80 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
27f90 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
27fa0 54 52 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a  TRY, (void*)a);.
27fb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27fc0 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
27fd0 20 22 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c   "%d %d %d", rc,
27fe0 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20   a[0], a[1]);.  
27ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28000 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
28010 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
28020 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
28030 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
28040 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
28050 67 65 74 5f 68 61 6e 64 6c 65 20 44 42 0a 2a 2a  get_handle DB.**
28060 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
28070 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
28080 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
28090 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
280a0 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
280b0 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f  FCNTL_WIN32_GET_
280c0 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a  HANDLE opcode..*
280d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
280e0 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
280f0 67 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c  get_handle(.  Cl
28100 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
28110 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
28120 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
28130 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
28140 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
28150 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
28160 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
28170 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
28180 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
28190 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
281a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
281b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
281c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
281d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
281e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
281f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
28200 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
28210 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20   HANDLE hFile = 
28220 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31  NULL;.  char z[1
28230 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
28240 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
28250 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28260 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28270 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28280 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
28290 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
282a0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
282b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
282c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
282d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
282e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
282f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28300 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
28310 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28320 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
28330 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
28340 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
28350 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47  TE_FCNTL_WIN32_G
28360 45 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20  ET_HANDLE,.     
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68         (void*)&h
28390 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  File);.  sqlite3
283a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
283b0 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c  (z), z, "%d %p",
283c0 20 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c   rc, (void*)hFil
283d0 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
283e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
283f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
28400 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
28410 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
28420 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
28430 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 20 44  n32_set_handle D
28440 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54  B HANDLE.**.** T
28450 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
28460 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
28470 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
28480 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
28490 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
284a0 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c  _WIN32_SET_HANDL
284b0 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
284c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
284d0 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72  CLAPI file_contr
284e0 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e  ol_win32_set_han
284f0 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  dle(.  ClientDat
28500 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
28510 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
28520 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
28530 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
28540 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28550 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
28560 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
28570 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
28580 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
28590 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
285a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
285b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
285c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
285d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
285e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
285f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
28600 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45  int rc;.  HANDLE
28610 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20   hFile = NULL;. 
28620 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20   char z[100];.. 
28630 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
28640 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
28650 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
28660 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
28670 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
28680 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
28690 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
286a0 20 30 29 2c 20 22 20 44 42 20 48 41 4e 44 4c 45   0), " DB HANDLE
286b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
286c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
286d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
286e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
286f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28700 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
28710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 57  ;.  }.  if( getW
28730 69 6e 33 32 48 61 6e 64 6c 65 28 69 6e 74 65 72  in32Handle(inter
28740 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
28750 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 68 46 69 6c  (objv[2]), &hFil
28760 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
28770 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
28790 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
287a0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
287b0 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e  TL_WIN32_SET_HAN
287c0 44 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DLE,.           
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29 3b   (void*)&hFile);
287f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
28800 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
28810 2c 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20 28  , "%d %p", rc, (
28820 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20 20  void*)hFile);.  
28830 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28840 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
28850 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
28860 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64  TCL_OK;  .}.#end
28870 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  if../*.** tclcmd
28880 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
28890 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20  _persist_wal DB 
288a0 50 45 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a  PERSIST-FLAG.**.
288b0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
288c0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
288d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
288e0 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
288f0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
28900 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
28910 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
28920 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
28930 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
28940 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20  l_persist_wal(. 
28950 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
28960 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
28970 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
28980 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
28990 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
289a0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
289b0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
289c0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
289d0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
289e0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
289f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28a00 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
28a10 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
28a20 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
28a30 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
28a40 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
28a50 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
28a60 3b 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74  ;.  int bPersist
28a70 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
28a80 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
28a90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
28aa0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
28ab0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
28ac0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
28ad0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
28ae0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
28af0 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
28b00 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
28b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28b20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
28b30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
28b40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28b50 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
28b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28b70 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
28b80 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
28b90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
28ba0 26 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74  &bPersist) ) ret
28bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
28bd0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
28be0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
28bf0 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  L_PERSIST_WAL, (
28c00 76 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29  void*)&bPersist)
28c10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
28c20 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
28c30 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20  z, "%d %d", rc, 
28c40 62 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c  bPersist);.  Tcl
28c50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28c60 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
28c70 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
28c80 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
28c90 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
28ca0 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
28cb0 5f 6f 76 65 72 77 72 69 74 65 20 44 42 20 50 53  _overwrite DB PS
28cc0 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  OW-FLAG.**.** Th
28cd0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
28ce0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
28cf0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
28d00 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
28d10 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
28d20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
28d30 49 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  ITE opcode..*/.s
28d40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
28d50 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
28d60 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
28d70 76 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65  verwrite(.  Clie
28d80 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28d90 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28da0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28db0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28dc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28dd0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28de0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28df0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28e00 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28e10 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28e20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28e30 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28e40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28e50 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28e60 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28e70 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
28e80 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
28e90 6e 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31  nt b;.  char z[1
28ea0 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
28eb0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28ec0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28ed0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28ee0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28ef0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
28f00 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
28f10 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
28f20 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20   FLAG", 0);.    
28f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
28f50 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
28f60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28f70 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
28f80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28f90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28fa0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28fb0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28fc0 32 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  2], &b) ) return
28fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
28fe0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
28ff0 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c  control(db,NULL,
29000 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
29010 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
29020 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73  ,(void*)&b);.  s
29030 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29040 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
29050 64 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20  d %d", rc, b);. 
29060 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29070 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
29080 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
29090 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
290a0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
290b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
290c0 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a  ame DB ?AUXDB?.*
290d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
290e0 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
290f0 62 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66  bes the stack of
29100 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   VFSes..*/.stati
29110 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
29120 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
29130 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65  _vfsname(.  Clie
29140 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29150 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
29160 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
29170 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
29180 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29190 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
291a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
291b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
291c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
291d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
291e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
291f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
29200 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29210 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
29220 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
29230 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
29240 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
29250 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  *zDbName = "main
29260 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e  ";.  char *zVfsN
29270 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
29280 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
29290 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
292a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
292b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
292c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
292d0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
292e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
292f0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
29300 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20  ?AUXDB?", 0);.  
29310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29320 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
29330 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
29340 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
29350 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
29360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
29370 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
29380 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
29390 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f    zDbName = Tcl_
293a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
293b0 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
293c0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
293d0 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49  b, zDbName, SQLI
293e0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
293f0 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d  ,(void*)&zVfsNam
29400 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
29410 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
29420 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  VfsName, (char*)
29430 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
29440 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ee(zVfsName);.  
29450 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
29460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
29470 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
29480 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42  _tempfilename DB
29490 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
294a0 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
294b0 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72 61  hat is a tempora
294c0 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73  ry filename.*/.s
294d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
294e0 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
294f0 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
29500 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
29510 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
29520 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
29530 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
29540 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
29550 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
29560 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
29570 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
29580 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
29590 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
295a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
295b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
295c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
295d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
295e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
295f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
29600 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
29610 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
29620 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68  e = "main";.  ch
29630 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a  ar *zTName = 0;.
29640 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26  .  if( objc!=2 &
29650 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
29660 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29670 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
29680 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
29690 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
296a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
296b0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
296c0 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c  , " DB ?AUXDB?",
296d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
296e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
296f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
29700 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
29710 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
29720 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
29730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29740 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
29750 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65  3 ){.    zDbName
29760 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
29770 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  (objv[2]);.  }. 
29780 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
29790 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d  ntrol(db, zDbNam
297a0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
297b0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76  TEMPFILENAME, (v
297c0 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20  oid*)&zTName);. 
297d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
297e0 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65  t(interp, zTName
297f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73  , (char*)0);.  s
29800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61  qlite3_free(zTNa
29810 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  me);.  return TC
29820 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  L_OK;  .}.../*.*
29830 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69  * tclcmd:   sqli
29840 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a  te3_vfs_list.**.
29850 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63  **   Return a tc
29860 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  l list containin
29870 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  g the names of a
29880 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66  ll registered vf
29890 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s's..*/.static i
298a0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
298b0 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69   vfs_list(.  Cli
298c0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
298d0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
298e0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
298f0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
29900 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29910 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
29920 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
29930 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
29940 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
29950 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
29960 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29970 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
29980 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29990 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
299a0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
299b0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
299c0 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f  fs *pVfs;.  Tcl_
299d0 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
299e0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20  NewObj();.  if( 
299f0 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
29a00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
29a10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
29a20 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
29a30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29a40 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74    for(pVfs=sqlit
29a50 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20  e3_vfs_find(0); 
29a60 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d  pVfs; pVfs=pVfs-
29a70 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c  >pNext){.    Tcl
29a80 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
29a90 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
29aa0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
29ab0 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  gObj(pVfs->zName
29ac0 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63  , -1));.  }.  Tc
29ad0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
29ae0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
29af0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
29b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
29b10 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  :   sqlite3_limi
29b20 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a  t DB ID VALUE.**
29b30 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
29b40 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
29b50 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65  lite3_limit inte
29b60 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
29b70 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
29b80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
29b90 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
29ba0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
29bb0 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43   test_limit(.  C
29bc0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
29bd0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
29be0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
29bf0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
29c00 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
29c10 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
29c20 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
29c30 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
29c40 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
29c50 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
29c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29c70 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
29c80 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
29c90 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
29ca0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
29cb0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
29cc0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
29cd0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
29ce0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
29cf0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
29d00 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d  nt id;.  } aId[]
29d10 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
29d20 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22  TE_LIMIT_LENGTH"
29d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
29d40 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
29d50 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
29d60 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
29d70 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
29d80 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
29d90 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
29da0 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
29db0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
29dc0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20  _LIMIT_COLUMN", 
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
29de0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
29e00 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
29e10 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
29e20 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
29e30 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
29e40 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PTH           },
29e50 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
29e60 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
29e70 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54  LECT",     SQLIT
29e80 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
29e90 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a  _SELECT      },.
29ea0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
29eb0 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20  MIT_VDBE_OP",   
29ec0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
29ed0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
29ef0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
29f00 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22  IT_FUNCTION_ARG"
29f10 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
29f20 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
29f30 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  RG         },.  
29f40 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
29f50 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20  T_ATTACHED",    
29f60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
29f70 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
29f80 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
29f90 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
29fa0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
29fb0 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49  NGTH", SQLITE_LI
29fc0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
29fd0 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20  _LENGTH  },.    
29fe0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
29ff0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
2a000 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
2a010 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
2a020 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ER      },.    {
2a030 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
2a040 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20  RIGGER_DEPTH",  
2a050 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2a060 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
2a070 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2a080 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  "SQLITE_LIMIT_WO
2a090 52 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20  RKER_THREADS",  
2a0a0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2a0b0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
2a0c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20        },.    .  
2a0d0 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67    /* Out of rang
2a0e0 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a  e test cases */.
2a0f0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2a100 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20  MIT_TOOSMALL",  
2a110 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20            -1,   
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2a140 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2a150 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20  IT_TOOBIG",     
2a160 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2a170 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
2a180 45 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20  EADS+1     },.  
2a190 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20 3d  };.  int i, id =
2a1a0 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20   0;.  int val;. 
2a1b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2a1c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
2a1d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2a1e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a1f0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2a200 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
2a210 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
2a220 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
2a230 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44  [0], 0), " DB ID
2a240 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
2a250 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a260 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a270 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a280 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2a290 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2a2a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a2b0 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47  R;.  zId = Tcl_G
2a2c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2a2d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2a2e0 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
2a2f0 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29  of(aId[0]); i++)
2a300 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
2a310 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61  (zId, aId[i].zNa
2a320 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
2a330 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a  id = aId[i].id;.
2a340 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a350 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d   }.  }.  if( i>=
2a360 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
2a370 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20  of(aId[0]) ){.  
2a380 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2a390 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
2a3a0 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20  own limit type: 
2a3b0 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30  ", zId, (char*)0
2a3c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a3d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a3e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2a3f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2a400 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
2a410 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c    rc = sqlite3_l
2a430 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c  imit(db, id, val
2a440 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
2a450 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2a460 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
2a470 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a480 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
2a490 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67  lcmd:  save_prng
2a4a0 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76  _state.**.** Sav
2a4b0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
2a4c0 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  he pseudo-random
2a4d0 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
2a4e0 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d  r..** At the sam
2a4f0 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74  e time, verify t
2a500 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  hat sqlite3_test
2a510 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65  _control works e
2a520 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c  ven when.** call
2a530 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ed with an out-o
2a540 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a  f-range opcode..
2a550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2a560 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 61 76 65  LITE_TCLAPI save
2a570 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
2a580 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a590 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
2a5a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
2a5b0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
2a5c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2a5d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a5e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a5f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a600 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a610 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a620 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a630 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a640 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a650 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a660 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a670 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2a680 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
2a690 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20  ontrol(9999);.  
2a6a0 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
2a6b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2a6c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29  test_control(-1)
2a6d0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
2a6e0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  0 );.  sqlite3_t
2a6f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2a700 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
2a710 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e  _SAVE);.  return
2a720 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
2a730 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72   tclcmd:  restor
2a740 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  e_prng_state.*/.
2a750 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2a760 45 5f 54 43 4c 41 50 49 20 72 65 73 74 6f 72 65  E_TCLAPI restore
2a770 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
2a780 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a790 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
2a7a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
2a7b0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
2a7c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2a7d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a7e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a7f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a800 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a810 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a820 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a830 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a840 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a850 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a860 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a870 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2a880 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2a890 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
2a8a0 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20 72  NG_RESTORE);.  r
2a8b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2a8c0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72  /*.** tclcmd:  r
2a8d0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a  eset_prng_state.
2a8e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2a8f0 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65 73 65  LITE_TCLAPI rese
2a900 74 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  t_prng_state(.  
2a910 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2a920 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2a930 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2a940 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2a950 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2a960 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2a970 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2a980 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2a990 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2a9a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2a9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a9c0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2a9d0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2a9e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2a9f0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2aa00 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
2aa10 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2aa20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
2aa30 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65  RNG_RESET);.  re
2aa40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2aa50 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64  /*.** tclcmd:  d
2aa60 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2aa70 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64  orrupt.**.** Ind
2aa80 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61 62  icate that datab
2aa90 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
2aaa0 62 65 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  be corrupt.  In 
2aab0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74  other words, set
2aac0 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73   the normal.** s
2aad0 74 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f  tate of operatio
2aae0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2aaf0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
2ab00 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2ab10 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74  orrupt(.  Client
2ab20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2ab30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2ab40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2ab50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2ab60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ab70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2ab80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2ab90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2aba0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2abb0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2abc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2abd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2abe0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2abf0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2ac00 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2ac10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2ac20 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2ac30 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
2ac40 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65  ORRUPT, 0);.  re
2ac50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
2ac60 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61  *.** tclcmd:  da
2ac70 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2ac80 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  rupt.**.** Indic
2ac90 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73  ate that databas
2aca0 65 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61  e files are alwa
2acb0 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  ys well-formed. 
2acc0 20 54 68 69 73 20 65 6e 61 62 6c 65 73 20 65 78   This enables ex
2acd0 74 72 61 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  tra assert().** 
2ace0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
2acf0 74 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20  test conditions 
2ad00 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20  that are always 
2ad10 74 72 75 65 20 66 6f 72 20 77 65 6c 6c 2d 66 6f  true for well-fo
2ad20 72 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  rmed databases..
2ad30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2ad40 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61 74 61  LITE_TCLAPI data
2ad50 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75  base_never_corru
2ad60 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  pt(.  ClientData
2ad70 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2ad80 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2ad90 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
2ada0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
2adb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2adc0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2add0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2ade0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2adf0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2ae00 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2ae10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2ae20 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2ae30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2ae40 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2ae50 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2ae60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2ae70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2ae80 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
2ae90 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  PT, 1);.  return
2aea0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2aeb0 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
2aec0 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
2aed0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2aee0 41 50 49 20 74 65 73 74 5f 70 63 61 63 68 65 5f  API test_pcache_
2aef0 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44  stats(.  ClientD
2af00 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2af10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2af20 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2af30 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2af40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2af50 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2af60 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2af70 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2af80 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af90 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2afa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2afb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2afc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2afd0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2afe0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2aff0 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69  .  int nMin;.  i
2b000 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e  nt nMax;.  int n
2b010 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e  Current;.  int n
2b020 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63  Recyclable;.  Tc
2b030 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
2b040 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61  sqlite3PcacheSta
2b050 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e  ts(&nCurrent, &n
2b060 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65  Max, &nMin, &nRe
2b070 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52  cyclable);..  pR
2b080 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
2b090 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2b0a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2b0b0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
2b0c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75  NewStringObj("cu
2b0d0 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20  rrent", -1));.  
2b0e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b0f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b100 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2b110 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b  tObj(nCurrent));
2b120 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2b130 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2b140 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2b150 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22  wStringObj("max"
2b160 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2b170 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2b180 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2b190 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2b1a0 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Max));.  Tcl_Lis
2b1b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b1c0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2b1d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b1e0 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  ("min", -1));.  
2b1f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b200 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b210 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2b220 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54  tObj(nMin));.  T
2b230 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b240 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b250 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
2b260 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62  ingObj("recyclab
2b270 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  le", -1));.  Tcl
2b280 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2b290 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2b2a0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2b2b0 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b  j(nRecyclable));
2b2c0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
2b2d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
2b2e0 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  t);..  return TC
2b2f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  L_OK;.}..#ifdef 
2b300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
2b310 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
2b320 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c  ic void test_unl
2b330 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f  ock_notify_cb(vo
2b340 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e  id **aArg, int n
2b350 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  Arg){.  int ii;.
2b360 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2b370 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Arg; ii++){.    
2b380 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f  Tcl_EvalEx((Tcl_
2b390 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69  Interp *)aArg[ii
2b3a0 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  ], "unlock_notif
2b3b0 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  y", -1, TCL_EVAL
2b3c0 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  _GLOBAL);.  }.}.
2b3d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2b3e0 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
2b3f0 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  OTIFY */../*.** 
2b400 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2b410 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64  _unlock_notify d
2b420 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  b.*/.#ifdef SQLI
2b430 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
2b440 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69  _NOTIFY.static i
2b450 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2b460 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
2b470 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ify(.  ClientDat
2b480 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2b490 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2b4a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2b4b0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2b4c0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2b4d0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2b4e0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2b4f0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2b500 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2b510 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2b520 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2b530 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2b540 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2b550 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2b560 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2b570 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2b580 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2b590 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2b5a0 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
2b5b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2b5c0 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2b5d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2b5e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2b5f0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2b600 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b610 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
2b620 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
2b630 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c  ify(db, test_unl
2b640 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28  ock_notify_cb, (
2b650 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a  void *)interp);.
2b660 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2b670 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2b680 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
2b690 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2b6a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2b6b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74  .#endif../*.** t
2b6c0 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2b6d0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
2b6e0 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74  b ?NAME?.*/.stat
2b6f0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2b700 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 63 68  LAPI test_wal_ch
2b710 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65  eckpoint(.  Clie
2b720 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2b730 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2b740 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2b750 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2b760 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2b770 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2b780 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2b790 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2b7a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b7b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2b7c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b7d0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2b7e0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2b7f0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
2b800 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
2b810 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
2b820 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
2b830 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2b840 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2b850 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2b860 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20   "DB ?NAME?");. 
2b870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b880 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
2b890 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2b8a0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2b8b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2b8c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b8d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b8e0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
2b8f0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
2b900 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2b910 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2b920 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
2b930 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
2b940 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2b950 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
2b960 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2b970 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
2b980 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2b990 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
2b9a0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
2b9b0 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45  point_v2 db MODE
2b9c0 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68   ?NAME?.**.** Th
2b9d0 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73  is command calls
2b9e0 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f   the wal_checkpo
2b9f0 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  int_v2() functio
2ba00 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  n with the speci
2ba10 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67  fied.** mode arg
2ba20 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20  ument (passive, 
2ba30 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29  full or restart)
2ba40 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68  . If present, th
2ba50 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  e database name.
2ba60 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65  ** NAME is passe
2ba70 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2ba80 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f  argument to wal_
2ba90 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e  checkpoint_v2().
2baa0 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41   If it the.** NA
2bab0 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ME argument is n
2bac0 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55  ot present, a NU
2bad0 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61  LL pointer is pa
2bae0 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  ssed instead..**
2baf0 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b  .** If wal_check
2bb00 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72  point_v2() retur
2bb10 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68  ns any value oth
2bb20 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
2bb30 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  USY or.** SQLITE
2bb40 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63  _OK, then this c
2bb50 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54  ommand returns T
2bb60 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63  CL_ERROR. The Tc
2bb70 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a  l result is set.
2bb80 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ** to the error 
2bb90 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64  message obtained
2bba0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
2bbb0 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  rmsg()..**.** Ot
2bbc0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f  herwise, this co
2bbd0 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  mmand returns a 
2bbe0 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e  list of three in
2bbf0 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
2bc00 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20  t integer.** is 
2bc10 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  1 if SQLITE_BUSY
2bc20 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f   was returned, o
2bc30 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54  r 0 otherwise. T
2bc40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2bc50 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65   integers.** are
2bc60 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
2bc70 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74  rned via the out
2bc80 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62  put parameters b
2bc90 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  y wal_checkpoint
2bca0 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e  _v2() -.** the n
2bcb0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
2bcc0 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74  in the log and t
2bcd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
2bce0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a  mes in the log.*
2bcf0 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  * that have been
2bd00 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
2bd10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2bd20 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2bd30 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
2bd40 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
2bd50 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2bd60 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2bd70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2bd80 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2bd90 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2bda0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2bdb0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2bdc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2bdd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2bde0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2bdf0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2be00 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2be10 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2be20 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
2be30 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2be40 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d  nt rc;..  int eM
2be50 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20  ode;.  int nLog 
2be60 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43  = -555;.  int nC
2be70 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63  kpt = -555;.  Tc
2be80 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
2be90 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d 6f  const char * aMo
2bea0 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69 76  de[] = { "passiv
2beb0 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65 73  e", "full", "res
2bec0 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61 74 65  tart", "truncate
2bed0 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72 74  ", 0 };.  assert
2bee0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
2bef0 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
2bf00 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2bf10 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
2bf20 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
2bf30 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
2bf40 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
2bf50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2bf60 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
2bf70 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 0a 20  RUNCATE==3 );.. 
2bf80 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
2bf90 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
2bfa0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2bfb0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2bfc0 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f   "DB MODE ?NAME?
2bfd0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2bfe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2bff0 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
2c000 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
2c010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
2c020 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2c030 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c040 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2c050 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 7c 7c  bjv[1]), &db) ||
2c060 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f 4b 21   (.      TCL_OK!
2c070 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
2c080 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  bj(0, objv[2], &
2c090 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54 43 4c  eMode).   && TCL
2c0a0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 64 65  _OK!=Tcl_GetInde
2c0b0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
2c0c0 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c   objv[2], aMode,
2c0d0 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f   "mode", 0, &eMo
2c0e0 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20 20 72  de) .  )){.    r
2c0f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c100 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2c110 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
2c120 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
2c130 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e  eMode, &nLog, &n
2c140 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21  Ckpt);.  if( rc!
2c150 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
2c160 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
2c170 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c180 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69  *zErrCode = sqli
2c190 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a  te3ErrName(rc);.
2c1a0 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
2c1b0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
2c1c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2c1d0 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 43 6f  t(interp, zErrCo
2c1e0 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68 61 72  de, " - ", (char
2c1f0 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2c200 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
2c210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c220 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
2c230 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
2c240 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c250 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c260 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2c270 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42  Obj(rc==SQLITE_B
2c280 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c  USY?1:0));.  Tcl
2c290 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c2a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2c2b0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2c2c0 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f  j(nLog));.  Tcl_
2c2d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c2e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2c2f0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2c300 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f  (nCkpt));.  Tcl_
2c310 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2c320 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72  erp, pRet);..  r
2c330 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2c340 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2c350 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
2c360 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 56 41  checkpoint db VA
2c370 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LUE.*/.static in
2c380 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2c390 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65  test_wal_autoche
2c3a0 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
2c3b0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2c3c0 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
2c3d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2c3e0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2c3f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2c400 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2c410 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2c420 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2c430 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c440 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2c450 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2c460 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2c470 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2c480 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2c490 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2c4a0 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66 28 20  t iVal;...  if( 
2c4b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
2c4c0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2c4d0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2c4e0 20 22 44 42 20 56 41 4c 55 45 22 29 3b 0a 20 20   "DB VALUE");.  
2c4f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c500 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
2c510 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2c520 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2c530 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2c540 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49   .   || Tcl_GetI
2c550 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a  ntFromObj(0, obj
2c560 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20 20 29  v[2], &iVal).  )
2c570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2c580 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
2c590 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  c = sqlite3_wal_
2c5a0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
2c5b0 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63 6c 5f  b, iVal);.  Tcl_
2c5c0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2c5d0 72 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rp);.  if( rc!=S
2c5e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c5f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
2c600 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72  Code = sqlite3Er
2c610 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54  rName(rc);.    T
2c620 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2c630 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
2c640 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43 6f 64  tringObj(zErrCod
2c650 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  e, -1));.    ret
2c660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c670 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
2c680 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
2c690 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c  clcmd:  test_sql
2c6a0 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54  ite3_log ?SCRIPT
2c6b0 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ?.*/.static stru
2c6c0 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b  ct LogCallback {
2c6d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70  .  Tcl_Interp *p
2c6e0 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  Interp;.  Tcl_Ob
2c6f0 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61  j *pObj;.} logca
2c700 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b  llback = {0, 0};
2c710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f  .static void xLo
2c720 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  gcallback(void *
2c730 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c  unused, int err,
2c740 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
2c750 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20  Tcl_Obj *pNew = 
2c760 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2c770 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
2c780 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  j);.  Tcl_IncrRe
2c790 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20  fCount(pNew);.  
2c7a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c7b0 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20  dElement(.      
2c7c0 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
2c7d0 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
2c7e0 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d  3ErrName(err), -
2c7f0 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69  1).  );.  Tcl_Li
2c800 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c810 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f  nt(0, pNew, Tcl_
2c820 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73  NewStringObj(zMs
2c830 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  g, -1));.  Tcl_E
2c840 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c  valObjEx(logcall
2c850 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e  back.pInterp, pN
2c860 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  ew, TCL_EVAL_GLO
2c870 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
2c880 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
2c890 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
2c8a0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  }.static int SQL
2c8b0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2c8c0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43  sqlite3_log(.  C
2c8d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2c8e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2c8f0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2c900 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2c910 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2c920 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2c930 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2c940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c950 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2c960 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2c970 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2c980 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2c990 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  nts */.){.  if( 
2c9a0 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63  objc>2 ){.    Tc
2c9b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2c9c0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2c9d0 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72  "SCRIPT");.    r
2c9e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c9f0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61  .  }.  if( logca
2ca00 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20  llback.pObj ){. 
2ca10 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2ca20 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  unt(logcallback.
2ca30 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61  pObj);.    logca
2ca40 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b  llback.pObj = 0;
2ca50 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
2ca60 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20  .pInterp = 0;.  
2ca70 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
2ca80 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c  (SQLITE_CONFIG_L
2ca90 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28 76  OG, (void*)0, (v
2caa0 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69  oid*)0);.  }.  i
2cab0 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
2cac0 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
2cad0 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20  j = objv[1];.   
2cae0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2caf0 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  t(logcallback.pO
2cb00 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  bj);.    logcall
2cb10 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69  back.pInterp = i
2cb20 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74  nterp;.    sqlit
2cb30 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
2cb40 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f  _CONFIG_LOG, xLo
2cb50 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  gcallback, (void
2cb60 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *)0);.  }.  retu
2cb70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2cb80 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70  .**     tcl_objp
2cb90 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20  roc COMMANDNAME 
2cba0 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75  ARGS....**.** Ru
2cbb0 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  n a TCL command 
2cbc0 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f  using its objPro
2cbd0 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68  c interface.  Th
2cbe0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a  row an error if.
2cbf0 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68  ** the command h
2cc00 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e  as no objProc in
2cc10 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
2cc20 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2cc30 4c 41 50 49 20 72 75 6e 41 73 4f 62 6a 50 72 6f  LAPI runAsObjPro
2cc40 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
2cc50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2cc60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2cc70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2cc80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2cc90 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  ].){.  Tcl_CmdIn
2cca0 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66  fo cmdInfo;.  if
2ccb0 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
2ccc0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2ccd0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2cce0 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  , "COMMAND ...")
2ccf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2cd00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2cd10 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
2cd20 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
2cd30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2cd40 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
2cd50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cd60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cd70 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
2cd80 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
2cd90 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
2cda0 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
2cdb0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2cdc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2cdd0 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a   if( cmdInfo.obj
2cde0 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54  Proc==0 ){.    T
2cdf0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ce00 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
2ce10 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a   has no objProc:
2ce20 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54   ",.           T
2ce30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2ce40 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
2ce50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2ce60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
2ce70 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a  turn cmdInfo.obj
2ce80 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a  Proc(cmdInfo.obj
2ce90 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65  ClientData, inte
2cea0 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76  rp, objc-1, objv
2ceb0 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  +1);.}..#ifndef 
2cec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2ced0 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e  AIN./*.** WARNIN
2cee0 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  G: The following
2cef0 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74   function, print
2cf00 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
2cf10 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a  () is an exact.*
2cf20 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c  * copy of exampl
2cf30 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e  e code from eqp.
2cf40 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49  in (eqp.html). I
2cf50 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d  f this code is m
2cf60 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e  odified,.** then
2cf70 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
2cf80 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f  on copy needs to
2cf90 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
2cfa0 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  well..*/./*.** A
2cfb0 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73  rgument pStmt is
2cfc0 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20   a prepared SQL 
2cfd0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
2cfe0 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65  function compile
2cff0 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20  s.** an EXPLAIN 
2d000 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
2d010 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20  nd to report on 
2d020 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
2d030 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70  tement,.** and p
2d040 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74  rints the report
2d050 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67   to stdout using
2d060 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e   printf()..*/.in
2d070 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  t printExplainQu
2d080 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f  eryPlan(sqlite3_
2d090 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  stmt *pStmt){.  
2d0a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2d0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d0c0 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a  /* Input SQL */.
2d0d0 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e    char *zExplain
2d0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d0f0 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58    /* SQL with EX
2d100 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2d110 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20   prepended */.  
2d120 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
2d130 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20  xplain;         
2d140 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c  /* Compiled EXPL
2d150 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
2d160 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2d170 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2d180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2d190 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2d1a0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2d1b0 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20  v2() */..  zSql 
2d1c0 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
2d1d0 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  tmt);.  if( zSql
2d1e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2d1f0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  ITE_ERROR;..  zE
2d200 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
2d210 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
2d220 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
2d230 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  , zSql);.  if( z
2d240 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74  Explain==0 ) ret
2d250 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d260 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2d270 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c  3_prepare_v2(sql
2d280 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
2d290 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c  Stmt), zExplain,
2d2a0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
2d2b0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
2d2c0 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ee(zExplain);.  
2d2d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d2e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
2d2f0 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
2d300 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2d310 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20  p(pExplain) ){. 
2d320 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64     int iSelectid
2d330 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2d340 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
2d350 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64  0);.    int iOrd
2d360 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  er = sqlite3_col
2d370 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2d380 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46  , 1);.    int iF
2d390 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  rom = sqlite3_co
2d3a0 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2d3b0 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74  n, 2);.    const
2d3c0 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d   char *zDetail =
2d3d0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2d3e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2d3f0 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
2d400 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64  ..    printf("%d
2d410 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53   %d %d %s\n", iS
2d420 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c  electid, iOrder,
2d430 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29   iFrom, zDetail)
2d440 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2d450 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2d460 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73  (pExplain);.}..s
2d470 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2d480 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 69  _TCLAPI test_pri
2d490 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a  nt_eqp(.  void *
2d4a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2d4b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2d4c0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2d4d0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2d4e0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2d4f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
2d500 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
2d510 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2d520 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2d530 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2d540 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
2d550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
2d570 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
2d580 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2d590 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
2d5a0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
2d5b0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72  ERROR;.  rc = pr
2d5c0 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2d5d0 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  lan(pStmt);.  /*
2d5e0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
2d5f0 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68  on Windows so th
2d600 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20 75  at a test case u
2d610 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20  sing this .  ** 
2d620 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65  function can ope
2d630 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61 6e  n a read pipe an
2d640 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  d get the output
2d650 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78   of.  ** printEx
2d660 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29  plainQueryPlan()
2d670 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2d680 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  */.  fflush(stdo
2d690 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ut);.  Tcl_SetRe
2d6a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2d6b0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2d6c0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
2d6d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2d6e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2d6f0 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f  IT_EXPLAIN */../
2d700 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73  *.** sqlite3_tes
2d710 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41  t_control VERB A
2d720 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  RGS....*/.static
2d730 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2d740 50 49 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e  PI test_test_con
2d750 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
2d760 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2d770 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d780 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2d790 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2d7a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
2d7b0 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73   Verb {.    cons
2d7c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
2d7d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56     int i;.  } aV
2d7e0 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  erb[] = {.    { 
2d7f0 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2d800 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2d810 22 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ", SQLITE_TESTCT
2d820 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
2d830 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51  LT }, .    { "SQ
2d840 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
2d850 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20 20 20 20  RTER_MMAP",     
2d860 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2d870 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20 20 20 20  SORTER_MMAP     
2d880 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  }, .    { "SQLIT
2d890 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
2d8a0 54 45 52 22 2c 20 20 20 20 20 20 20 20 53 51 4c  TER",        SQL
2d8b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2d8c0 4f 53 54 45 52 20 20 20 20 20 20 20 20 7d 2c 0a  OSTER        },.
2d8d0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56 65 72 62    };.  int iVerb
2d8e0 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20  ;.  int iFlag;. 
2d8f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2d900 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
2d910 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2d920 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2d930 22 56 45 52 42 20 41 52 47 53 2e 2e 2e 22 29 3b  "VERB ARGS...");
2d940 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d950 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63  ERROR;.  }..  rc
2d960 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
2d970 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20  romObjStruct(.  
2d980 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76      interp, objv
2d990 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73 69 7a 65  [1], aVerb, size
2d9a0 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c 20 22 56  of(aVerb[0]), "V
2d9b0 45 52 42 22 2c 20 30 2c 20 26 69 56 65 72 62 0a  ERB", 0, &iVerb.
2d9c0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54    );.  if( rc!=T
2d9d0 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
2d9e0 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d 20 61 56  c;..  iFlag = aV
2d9f0 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b 0a 20 20  erb[iVerb].i;.  
2da00 73 77 69 74 63 68 28 20 69 46 6c 61 67 20 29 7b  switch( iFlag ){
2da10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2da20 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
2da30 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
2da40 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20     int val;.    
2da50 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
2da60 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
2da70 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2da80 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46  , 2, objv, "ONOF
2da90 46 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  F");.        ret
2daa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2dab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dac0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
2dad0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2dae0 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[2], &val) ) 
2daf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2db00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2db10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2db20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2db30 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 76 61  ALTIME_FAULT, va
2db40 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
2db50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
2db60 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2db70 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
2db80 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
2db90 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2dba0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
2dbb0 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=4 ){.        T
2dbc0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2dbd0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
2dbe0 20 22 44 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20   "DB LIMIT");.  
2dbf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2dc00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
2dc10 20 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50        if( getDbP
2dc20 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2dc30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2dc40 76 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[2]), &db) ) re
2dc50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2dc60 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
2dc70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2dc80 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
2dc90 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
2dca0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
2dcb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2dcc0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2dcd0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
2dce0 62 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62  b, val);.      b
2dcf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2dd00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
2dd10 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20  TCTRL_IMPOSTER: 
2dd20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 4f 66  {.      int onOf
2dd30 66 2c 20 74 6e 75 6d 3b 0a 20 20 20 20 20 20 63  f, tnum;.      c
2dd40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
2dd50 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
2dd60 33 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28  3 *db;.      if(
2dd70 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20   objc!=6 ){.    
2dd80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2dd90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
2dda0 6f 62 6a 76 2c 20 22 44 42 20 64 62 4e 61 6d 65  objv, "DB dbName
2ddb0 20 6f 6e 4f 66 66 20 74 6e 75 6d 22 29 3b 0a 20   onOff tnum");. 
2ddc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
2ddd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
2dde0 0a 20 20 20 20 20 20 69 66 28 20 67 65 74 44 62  .      if( getDb
2ddf0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2de00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2de10 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[2]), &db) ) r
2de20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2de30 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  .      zDbName =
2de40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2de50 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69  bjv[3]);.      i
2de60 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2de70 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2de80 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29 20 29 20  v[4], &onOff) ) 
2de90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2dea0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
2deb0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2dec0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
2ded0 74 6e 75 6d 29 20 29 20 72 65 74 75 72 6e 20 54  tnum) ) return T
2dee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2def0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2df00 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2df10 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
2df20 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66  b, zDbName, onOf
2df30 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  f, tnum);.      
2df40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2df50 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ..  Tcl_ResetRes
2df60 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2df70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2df80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
2df90 4e 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  NIX.#include <sy
2dfa0 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75  s/time.h>.#inclu
2dfb0 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
2dfc0 2e 68 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .h>..static int 
2dfd0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2dfe0 73 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20  st_getrusage(.  
2dff0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
2e000 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2e010 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2e020 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2e030 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2e040 20 20 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d    char buf[1024]
2e050 3b 0a 20 20 73 74 72 75 63 74 20 72 75 73 61 67  ;.  struct rusag
2e060 65 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72  e r;.  memset(&r
2e070 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b  , 0, sizeof(r));
2e080 0a 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53  .  getrusage(RUS
2e090 41 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a  AGE_SELF, &r);..
2e0a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2e0b0 74 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  tf(sizeof(buf), 
2e0c0 62 75 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69  buf,.    "ru_uti
2e0d0 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74  me=%d.%06d ru_st
2e0e0 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d  ime=%d.%06d ru_m
2e0f0 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66  inflt=%d ru_majf
2e100 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e  lt=%d", .    (in
2e110 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f  t)r.ru_utime.tv_
2e120 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75  sec, (int)r.ru_u
2e130 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20  time.tv_usec, . 
2e140 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69     (int)r.ru_sti
2e150 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29  me.tv_sec, (int)
2e160 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73  r.ru_stime.tv_us
2e170 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e  ec, .    (int)r.
2e180 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29  ru_minflt, (int)
2e190 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b  r.ru_majflt.  );
2e1a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2e1b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2e1c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66  NewStringObj(buf
2e1d0 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e  , -1));.  return
2e1e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2e1f0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
2e200 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  _WIN./*.** Infor
2e210 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72  mation passed fr
2e220 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  om the main thre
2e230 61 64 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64  ad into the wind
2e240 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a  ows file locker.
2e250 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  ** background th
2e260 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  read..*/.struct 
2e270 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
2e280 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65  {.  char *evName
2e290 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
2e2a0 6f 66 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e  of event to sign
2e2b0 61 6c 20 74 68 72 65 61 64 20 73 74 61 72 74 75  al thread startu
2e2c0 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  p */.  HANDLE h;
2e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e2e0 6e 64 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65  ndle of the file
2e2f0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
2e300 0a 20 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20  .  int delay1;  
2e310 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20         /* Delay 
2e320 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a  before locking *
2e330 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20  /.  int delay2; 
2e340 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79          /* Delay
2e350 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e   before unlockin
2e360 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20  g */.  int ok;  
2e370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e380 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69  nished ok */.  i
2e390 6e 74 20 65 72 72 3b 20 20 20 20 20 20 20 20 20  nt err;         
2e3a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2e3b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
2e3c0 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .};.#endif...#if
2e3d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23   SQLITE_OS_WIN.#
2e3e0 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73  include <process
2e3f0 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61  .h>./*.** The ba
2e400 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20  ckground thread 
2e410 74 68 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c  that does file l
2e420 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
2e430 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44  c void SQLITE_CD
2e440 45 43 4c 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  ECL win32_file_l
2e450 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70  ocker(void *pApp
2e460 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20  Data){.  struct 
2e470 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
2e480 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e  *p = (struct win
2e490 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41  32FileLocker*)pA
2e4a0 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d  ppData;.  if( p-
2e4b0 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48  >evName ){.    H
2e4c0 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45  ANDLE ev = OpenE
2e4d0 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46  vent(EVENT_MODIF
2e4e0 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20  Y_STATE, FALSE, 
2e4f0 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20  p->evName);.    
2e500 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20  if ( ev ){.     
2e510 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20   SetEvent(ev);. 
2e520 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65       CloseHandle
2e530 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (ev);.    }.  }.
2e540 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20    if( p->delay1 
2e550 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79  ) Sleep(p->delay
2e560 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69  1);.  if( LockFi
2e570 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31  le(p->h, 0, 0, 1
2e580 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a  00000000, 0) ){.
2e590 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c      Sleep(p->del
2e5a0 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  ay2);.    Unlock
2e5b0 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c  File(p->h, 0, 0,
2e5c0 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a   100000000, 0);.
2e5d0 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20      p->ok = 1;. 
2e5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65   }else{.    p->e
2e5f0 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c  rr = 1;.  }.  Cl
2e600 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b  oseHandle(p->h);
2e610 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70  .  p->h = 0;.  p
2e620 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20  ->delay1 = 0;.  
2e630 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d  p->delay2 = 0;.}
2e640 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
2e650 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a  ITE_OS_WIN./*.**
2e660 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32        lock_win32
2e670 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44  _file FILENAME D
2e680 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a  ELAY1 DELAY2.**.
2e690 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  ** Get an exclus
2e6a0 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f  ive manditory lo
2e6b0 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44  ck on file for D
2e6c0 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY2 millisecon
2e6d0 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41  ds..** Wait DELA
2e6e0 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  Y1 milliseconds 
2e6f0 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
2e700 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
2e710 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2e720 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6c  TCLAPI win32_fil
2e730 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a  e_lock(.  void *
2e740 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2e750 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e760 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2e770 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2e780 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74  objv[].){.  stat
2e790 69 63 20 73 74 72 75 63 74 20 77 69 6e 33 32 46  ic struct win32F
2e7a0 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20  ileLocker x = { 
2e7b0 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b  "win32_file_lock
2e7c0 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ", 0, 0, 0, 0, 0
2e7d0 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
2e7e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63   *zFilename;.  c
2e7f0 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
2e800 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a   int retry = 0;.
2e810 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44    HANDLE ev;.  D
2e820 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20  WORD wResult;.  
2e830 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
2e840 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
2e850 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2e860 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2e870 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c  v, "FILENAME DEL
2e880 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20  AY1 DELAY2");.  
2e890 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e8a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
2e8b0 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  jc==1 ){.    sql
2e8c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e8d0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
2e8e0 2c 20 22 25 64 20 25 64 20 25 64 20 25 64 20 25  , "%d %d %d %d %
2e8f0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
2e900 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78           x.ok, x
2e910 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20  .err, x.delay1, 
2e920 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a  x.delay2, x.h);.
2e930 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2e940 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
2e950 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
2e960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2e970 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e  .  }.  while( x.
2e980 68 20 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b  h && retry<30 ){
2e990 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20  .    retry++;.  
2e9a0 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20    Sleep(100);.  
2e9b0 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20  }.  if( x.h ){. 
2e9c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2e9d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73  ult(interp, "bus
2e9e0 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  y", (char*)0);. 
2e9f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ea00 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
2ea10 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2ea20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
2ea30 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72  , &x.delay1) ) r
2ea40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ea50 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
2ea60 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
2ea70 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c   objv[3], &x.del
2ea80 61 79 32 29 20 29 20 72 65 74 75 72 6e 20 54 43  ay2) ) return TC
2ea90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65  L_ERROR;.  zFile
2eaa0 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
2eab0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
2eac0 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c   x.h = CreateFil
2ead0 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e  e(zFilename, GEN
2eae0 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49  ERIC_READ|GENERI
2eaf0 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  C_WRITE,.       
2eb00 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
2eb10 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52  E_READ|FILE_SHAR
2eb20 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e  E_WRITE, 0, OPEN
2eb30 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20  _ALWAYS,.       
2eb40 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52         FILE_ATTR
2eb50 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29  IBUTE_NORMAL, 0)
2eb60 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a  ;.  if( !x.h ){.
2eb70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2eb80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
2eb90 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
2eba0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63  ", zFilename, (c
2ebb0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2ebc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ebd0 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65   }.  ev = Create
2ebe0 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45  Event(NULL, TRUE
2ebf0 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d  , FALSE, x.evNam
2ec00 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29  e);.  if ( !ev )
2ec10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2ec20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ec30 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76  cannot create ev
2ec40 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65  ent: ", x.evName
2ec50 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2ec60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ec70 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74  R;.  }.  _begint
2ec80 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65  hread(win32_file
2ec90 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69  _locker, 0, (voi
2eca0 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28  d*)&x);.  Sleep(
2ecb0 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73  0);.  if ( (wRes
2ecc0 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e  ult = WaitForSin
2ecd0 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30  gleObject(ev, 10
2ece0 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45  000))!=WAIT_OBJE
2ecf0 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  CT_0 ){.    sqli
2ed00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2ed10 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
2ed20 20 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74   "0x%x", wResult
2ed30 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
2ed40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2ed50 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c  "wait failed: ",
2ed60 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
2ed70 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  ;.    CloseHandl
2ed80 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72  e(ev);.    retur
2ed90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2eda0 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65  .  CloseHandle(e
2edb0 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  v);.  return TCL
2edc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
2edd0 20 20 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f     exists_win32_
2ede0 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20  path PATH.**.** 
2edf0 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
2ee00 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
2ee10 64 20 70 61 74 68 20 65 78 69 73 74 73 2c 20 77  d path exists, w
2ee20 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2ee30 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79  fied name.** may
2ee40 20 65 78 63 65 65 64 20 32 36 30 20 63 68 61 72   exceed 260 char
2ee50 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2ee60 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2ee70 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2ee80 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2ee90 49 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70  I win32_exists_p
2eea0 61 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  ath(.  void *cli
2eeb0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2eec0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2eed0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2eee0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2eef0 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
2ef00 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2ef10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2ef20 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41  rp, 1, objv, "PA
2ef30 54 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TH");.    return
2ef40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2ef50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2ef60 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2ef70 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20  ewBooleanObj(.  
2ef80 20 20 20 20 47 65 74 46 69 6c 65 41 74 74 72 69      GetFileAttri
2ef90 62 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55  butesW( Tcl_GetU
2efa0 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29  nicode(objv[1]))
2efb0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
2efc0 54 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20  TTRIBUTES ));.  
2efd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2efe0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e  ../*.**      fin
2eff0 64 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54  d_win32_file PAT
2f000 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TERN.**.** Retur
2f010 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74  ns a list of ent
2f020 72 69 65 73 20 69 6e 20 61 20 64 69 72 65 63 74  ries in a direct
2f030 6f 72 79 20 74 68 61 74 20 6d 61 74 63 68 20 74  ory that match t
2f040 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
2f050 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66  tern,.** whose f
2f060 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2f070 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32  ame may exceed 2
2f080 34 38 20 63 68 61 72 61 63 74 65 72 73 20 69 66  48 characters if
2f090 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
2f0a0 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a  with.** "\\?\"..
2f0b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2f0c0 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33  LITE_TCLAPI win3
2f0d0 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76  2_find_file(.  v
2f0e0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2f0f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f100 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2f110 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2f120 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2f130 48 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65  HANDLE hFindFile
2f140 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
2f150 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32  E_VALUE;.  WIN32
2f160 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64  _FIND_DATAW find
2f170 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Data;.  Tcl_Obj 
2f180 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52  *listObj;.  DWOR
2f190 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
2f1a0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2f1b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f1c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2f1d0 6a 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a  jv, "PATTERN");.
2f1e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f1f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e  RROR;.  }.  hFin
2f200 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73  dFile = FindFirs
2f210 74 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e  tFileW(Tcl_GetUn
2f220 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20  icode(objv[1]), 
2f230 26 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66  &findData);.  if
2f240 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56  ( hFindFile==INV
2f250 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
2f260 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  E ){.    Tcl_Set
2f270 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2f280 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2f290 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2f2a0 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2f2b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f2c0 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f    listObj = Tcl_
2f2d0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
2f2e0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73  IncrRefCount(lis
2f2f0 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  tObj);.  do {.  
2f300 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2f310 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2f320 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f  p, listObj, Tcl_
2f330 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20  NewUnicodeObj(. 
2f340 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e         findData.
2f350 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b  cFileName, -1));
2f360 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2f370 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2f380 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54  terp, listObj, T
2f390 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
2f3a0 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61  (.        findDa
2f3b0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
2f3c0 74 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65  tes));.  } while
2f3d0 28 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28  ( FindNextFileW(
2f3e0 68 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64  hFindFile, &find
2f3f0 44 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45  Data) );.  lastE
2f400 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
2f410 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73  ror();.  if( las
2f420 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52  tErrno!=NO_ERROR
2f430 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
2f440 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c  RROR_NO_MORE_FIL
2f450 45 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c  ES ){.    FindCl
2f460 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
2f470 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2f480 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20  ount(listObj);. 
2f490 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2f4a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2f4b0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
2f4c0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
2f4d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f4e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64  RROR;.  }.  Find
2f4f0 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29  Close(hFindFile)
2f500 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
2f510 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  sult(interp, lis
2f520 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20  tObj);.  return 
2f530 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2f540 20 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e        delete_win
2f550 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45  32_file FILENAME
2f560 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74  .**.** Deletes t
2f570 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2f580 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  e, whose fully q
2f590 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
2f5a0 79 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20  y exceed 260.** 
2f5b0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
2f5c0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
2f5d0 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
2f5e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2f5f0 43 4c 41 50 49 20 77 69 6e 33 32 5f 64 65 6c 65  CLAPI win32_dele
2f600 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  te_file(.  void 
2f610 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2f620 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f630 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2f640 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2f650 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2f660 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2f670 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2f680 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2f690 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20   "FILENAME");.  
2f6a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2f6b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44  OR;.  }.  if( !D
2f6c0 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47  eleteFileW(Tcl_G
2f6d0 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2f6e0 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2f6f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2f700 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2f710 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2f720 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2f730 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f740 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2f750 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2f760 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2f770 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65  ./*.**      make
2f780 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2f790 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  TORY.**.** Creat
2f7a0 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2f7b0 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2f7c0 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2f7d0 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2f7e0 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2f7f0 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2f800 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2f810 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2f820 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
2f830 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f  in32_mkdir(.  vo
2f840 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2f850 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2f860 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2f870 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2f880 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2f890 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2f8a0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f8b0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2f8c0 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29  jv, "DIRECTORY")
2f8d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2f8e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2f8f0 28 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f  ( !CreateDirecto
2f900 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  ryW(Tcl_GetUnico
2f910 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  de(objv[1]), NUL
2f920 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  L) ){.    Tcl_Se
2f930 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2f940 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2f950 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2f960 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2f970 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f980 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2f990 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2f9a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2f9b0 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76  /*.**      remov
2f9c0 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45  e_win32_dir DIRE
2f9d0 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f  CTORY.**.** Remo
2f9e0 76 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  ves the specifie
2f9f0 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f  d directory, who
2fa00 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2fa10 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2fa20 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63  ed 248.** charac
2fa30 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2fa40 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2fa50 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2fa60 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2fa70 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20 76  win32_rmdir(.  v
2fa80 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2fa90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2faa0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2fab0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2fac0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2fad0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2fae0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2faf0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2fb00 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22  bjv, "DIRECTORY"
2fb10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2fb20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2fb30 66 28 20 21 52 65 6d 6f 76 65 44 69 72 65 63 74  f( !RemoveDirect
2fb40 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  oryW(Tcl_GetUnic
2fb50 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b  ode(objv[1])) ){
2fb60 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2fb70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2fb80 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2fb90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2fba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2fbb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2fbc0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2fbd0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2fbe0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2fbf0 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70  .../*.**      op
2fc00 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
2fc10 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41  ol DB OPT BOOLEA
2fc20 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  N.**.** Enable o
2fc30 72 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20  r disable query 
2fc40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73  optimizations us
2fc50 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
2fc60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a  test_control().*
2fc70 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69  * interface.  Di
2fc80 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e  sable if BOOLEAN
2fc90 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e   is false and en
2fca0 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
2fcb0 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20  is true..** OPT 
2fcc0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
2fcd0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2fce0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a  to be disabled..
2fcf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2fd00 4c 49 54 45 5f 54 43 4c 41 50 49 20 6f 70 74 69  LITE_TCLAPI opti
2fd10 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2fd20 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2fd30 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2fd40 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2fd50 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2fd60 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2fd70 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
2fd80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
2fd90 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a  nst char *zOpt;.
2fda0 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69    int onoff;.  i
2fdb0 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73  nt mask = 0;.  s
2fdc0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2fdd0 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
2fde0 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20  har *zOptName;. 
2fdf0 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d     int mask;.  }
2fe00 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20   aOpt[] = {.    
2fe10 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  { "all",        
2fe20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2fe30 41 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d  AllOpts        }
2fe40 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20  ,.    { "none", 
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe70 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71       },.    { "q
2fe80 75 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c  uery-flattener",
2fe90 20 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72       SQLITE_Quer
2fea0 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20  yFlattener },.  
2feb0 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68    { "column-cach
2fec0 65 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  e",        SQLIT
2fed0 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20  E_ColumnCache   
2fee0 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70   },.    { "group
2fef0 62 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20  by-order",      
2ff00 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2ff10 72 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20  rder   },.    { 
2ff20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74  "factor-constant
2ff30 73 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61  s",    SQLITE_Fa
2ff40 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a  ctorOutConst },.
2ff50 20 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d      { "distinct-
2ff60 6f 70 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c  opt",        SQL
2ff70 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
2ff80 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76     },.    { "cov
2ff90 65 72 2d 69 64 78 2d 73 63 61 6e 22 2c 20 20 20  er-idx-scan",   
2ffa0 20 20 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49     SQLITE_CoverI
2ffb0 64 78 53 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20  dxScan   },.    
2ffc0 7b 20 22 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d  { "order-by-idx-
2ffd0 6a 6f 69 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f  join",   SQLITE_
2ffe0 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d  OrderByIdxJoin }
2fff0 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e 73 69 74  ,.    { "transit
30000 69 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 53  ive",          S
30010 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65  QLITE_Transitive
30020 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
30030 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20  mit-noop-join", 
30040 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74       SQLITE_Omit
30050 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20  NoopJoin   },.  
30060 20 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20    { "stat3",    
30070 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
30080 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20  E_Stat34        
30090 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 34   },.    { "stat4
300a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
300b0 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20   SQLITE_Stat34  
300c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a         },.  };..
300d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
300e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
300f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
30100 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42   objv, "DB OPT B
30110 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65  OOLEAN");.    re
30120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30130 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
30140 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
30150 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
30160 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
30170 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30180 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
30190 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
301a0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e  rp, objv[3], &on
301b0 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43  off) ) return TC
301c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20  L_ERROR;.  zOpt 
301d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
301e0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  objv[2]);.  for(
301f0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
30200 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
30210 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
30220 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20  f( strcmp(zOpt, 
30230 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65  aOpt[i].zOptName
30240 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61  )==0 ){.      ma
30250 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73  sk = aOpt[i].mas
30260 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  k;.      break;.
30270 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
30280 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e  onoff ) mask = ~
30290 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73  mask;.  if( i>=s
302a0 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
302b0 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20  of(aOpt[0]) ){. 
302c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
302d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
302e0 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  nown optimizatio
302f0 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  n - should be on
30300 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20  e of:",.        
30310 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
30320 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28  ar*)0);.    for(
30330 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
30340 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
30350 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
30360 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
30370 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61  t(interp, " ", a
30380 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c  Opt[i].zOptName,
30390 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
303a0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
303b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
303c0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
303d0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
303e0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
303f0 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72  , db, mask);.  r
30400 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
30410 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f  ./*.**     load_
30420 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  static_extension
30430 20 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a   DB NAME ....**.
30440 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d  ** Load one or m
30450 6f 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ore statically l
30460 69 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73  inked extensions
30470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30480 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63  SQLITE_TCLAPI tc
30490 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
304a0 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20  sionCmd(.  void 
304b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
304c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
304d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
304e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
304f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
30500 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30510 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69  amatch_init(sqli
30520 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
30530 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
30540 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
30550 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
30560 61 72 72 61 79 5f 69 6e 69 74 28 73 71 6c 69 74  array_init(sqlit
30570 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
30580 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
30590 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
305a0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  n int sqlite3_cl
305b0 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74  osure_init(sqlit
305c0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
305d0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
305e0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
305f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 73  n int sqlite3_cs
30600 76 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  v_init(sqlite3*,
30610 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
30620 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
30630 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
30640 74 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69  t sqlite3_eval_i
30650 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
30660 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
30670 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
30680 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
30690 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
306a0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
306b0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
306c0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
306d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
306e0 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
306f0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30700 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30710 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30720 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30730 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73  ite3_ieee_init(s
30740 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
30750 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
30760 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
30770 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
30780 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28  3_nextchar_init(
30790 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
307a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
307b0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
307c0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
307d0 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e  e3_percentile_in
307e0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
307f0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
30800 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
30810 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
30820 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
30830 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30840 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30850 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30860 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30870 69 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69 6e  ite3_remember_in
30880 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
30890 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
308a0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
308b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
308c0 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69  lite3_series_ini
308d0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
308e0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
308f0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30900 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30910 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
30920 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
30930 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
30940 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
30950 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
30960 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69  lite3_totype_ini
30970 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30980 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30990 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
309a0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
309b0 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72  ite3_wholenumber
309c0 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
309d0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
309e0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
309f0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
30a00 20 73 71 6c 69 74 65 33 5f 75 6e 69 6f 6e 76 74   sqlite3_unionvt
30a10 61 62 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ab_init(sqlite3*
30a20 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
30a30 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
30a40 65 73 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  es*);.#ifdef SQL
30a50 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20  ITE_HAVE_ZLIB.  
30a60 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30a70 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28  e3_zipfile_init(
30a80 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
30a90 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
30aa0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 65  i_routines*);.#e
30ab0 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 63 6f  ndif.  static co
30ac0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
30ad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
30ae0 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28  tName;.    int (
30af0 2a 70 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a  *pInit)(sqlite3*
30b00 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
30b10 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
30b20 65 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e  es*);.  } aExten
30b30 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  sion[] = {.    {
30b40 20 22 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20   "amatch",      
30b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30b60 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20  3_amatch_init   
30b70 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30b80 20 20 20 7b 20 22 63 61 72 72 61 79 22 2c 20 20     { "carray",  
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30ba0 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69 6e 69  lite3_carray_ini
30bb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
30bc0 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72  },.    { "closur
30bd0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
30be0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72    sqlite3_closur
30bf0 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
30c00 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73      },.    { "cs
30c10 76 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  v",             
30c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 73        sqlite3_cs
30c30 76 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  v_init          
30c40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
30c50 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20   "eval",        
30c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30c70 33 5f 65 76 61 6c 5f 69 6e 69 74 20 20 20 20 20  3_eval_init     
30c80 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30c90 20 20 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20 20     { "fileio",  
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30cb0 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
30cc0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
30cd0 7d 2c 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65 72  },.    { "fuzzer
30ce0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30cf0 20 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72    sqlite3_fuzzer
30d00 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30d10 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65      },.    { "ie
30d20 65 65 37 35 34 22 2c 20 20 20 20 20 20 20 20 20  ee754",         
30d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 65        sqlite3_ie
30d40 65 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ee_init         
30d50 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
30d60 20 22 6e 65 78 74 63 68 61 72 22 2c 20 20 20 20   "nextchar",    
30d70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30d80 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 20  3_nextchar_init 
30d90 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30da0 20 20 20 7b 20 22 70 65 72 63 65 6e 74 69 6c 65     { "percentile
30db0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ",            sq
30dc0 6c 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65  lite3_percentile
30dd0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30de0 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67 65 78 70  },.    { "regexp
30df0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30e00 20 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70    sqlite3_regexp
30e10 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30e20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65      },.    { "re
30e30 6d 65 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20  member",        
30e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
30e50 6d 65 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20  member_init     
30e60 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
30e70 20 22 73 65 72 69 65 73 22 2c 20 20 20 20 20 20   "series",      
30e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30e90 33 5f 73 65 72 69 65 73 5f 69 6e 69 74 20 20 20  3_series_init   
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30eb0 20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c     { "spellfix",
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30ed0 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69  lite3_spellfix_i
30ee0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
30ef0 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65  },.    { "totype
30f00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30f10 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65    sqlite3_totype
30f20 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30f30 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e      },.    { "un
30f40 69 6f 6e 76 74 61 62 22 2c 20 20 20 20 20 20 20  ionvtab",       
30f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 6e        sqlite3_un
30f60 69 6f 6e 76 74 61 62 5f 69 6e 69 74 20 20 20 20  ionvtab_init    
30f70 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
30f80 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20   "wholenumber", 
30f90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30fa0 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
30fb0 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  it          },.#
30fc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
30fd0 45 5f 5a 4c 49 42 0a 20 20 20 20 7b 20 22 7a 69  E_ZLIB.    { "zi
30fe0 70 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  pfile",         
30ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69        sqlite3_zi
31000 70 66 69 6c 65 5f 69 6e 69 74 20 20 20 20 20 20  pfile_init      
31010 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69          },.#endi
31020 66 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33  f.  };.  sqlite3
31030 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
31040 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ar *zName;.  int
31050 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61   i, j, rc;.  cha
31060 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
31070 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a    if( objc<3 ){.
31080 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
31090 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
310a0 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e  objv, "DB NAME .
310b0 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
310c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
310d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
310e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
310f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
31100 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
31110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f   TCL_ERROR;.  fo
31120 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a  r(j=2; j<objc; j
31130 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ++){.    zName =
31140 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
31150 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  bjv[j]);.    for
31160 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
31170 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69  e(aExtension); i
31180 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
31190 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78  trcmp(zName, aEx
311a0 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e  tension[i].zExtN
311b0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
311c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
311d0 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78 74  >=ArraySize(aExt
311e0 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ension) ){.     
311f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
31200 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
31210 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c  ch extension: ",
31220 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30   zName, (char*)0
31230 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31240 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
31250 0a 20 20 20 20 69 66 28 20 61 45 78 74 65 6e 73  .    if( aExtens
31260 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b 0a  ion[i].pInit ){.
31270 20 20 20 20 20 20 72 63 20 3d 20 61 45 78 74 65        rc = aExte
31280 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64  nsion[i].pInit(d
31290 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b  b, &zErrMsg, 0);
312a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
312b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
312c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
312d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
312e0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
312f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
31300 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69 74  lt(interp, "init
31310 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c  ialization of ",
31320 20 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65 64   zName, " failed
31330 3a 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20  : ", zErrMsg,.  
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31350 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
31360 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
31370 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
31380 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
31390 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
313a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
313b0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72  }../*.**     sor
313c0 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61  ter_test_fakehea
313d0 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61  p BOOL.**.*/.sta
313e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
313f0 43 4c 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73  CLAPI sorter_tes
31400 74 5f 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f  t_fakeheap(.  vo
31410 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
31420 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
31430 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
31440 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
31450 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
31460 69 6e 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20  int bArg;.  if( 
31470 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
31480 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
31490 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
314a0 20 22 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65   "BOOL");.    re
314b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
314c0 20 20 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47    }..  if( Tcl_G
314d0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
314e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
314f0 2c 20 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20  , &bArg) ){.    
31500 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31510 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72  ;.  }..  if( bAr
31520 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
31530 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
31540 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20  .pHeap==0 ){.   
31550 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
31560 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53  Config.pHeap = S
31570 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
31580 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  (-1);.    }.  }e
31590 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  lse{.    if( sql
315a0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
315b0 2e 70 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49  .pHeap==SQLITE_I
315c0 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b  NT_TO_PTR(-1) ){
315d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
315e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
315f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
31600 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
31610 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
31620 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
31630 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72  /*.**     sorter
31640 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
31650 65 72 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50  er DB SQL1 NSTEP
31660 20 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70   SQL2.**.** Comp
31670 69 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ile SQL statemen
31680 74 20 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70  t $SQL1 and step
31690 20 69 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73   it $NSTEP times
316a0 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20  . For each row, 
316b0 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74  .** check that t
316c0 68 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20  he leftmost and 
316d0 72 69 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e  rightmost column
316e0 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 62  s returned are b
316f0 6f 74 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a  oth integers,.**
31700 20 61 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63   and that both c
31710 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
31720 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
31730 6e 20 65 78 65 63 75 74 65 20 73 74 61 74 65 6d  n execute statem
31740 65 6e 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b  ent $SQL2. Check
31750 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
31760 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  ent returns the 
31770 73 61 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69  same.** set of i
31780 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
31790 61 6d 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20  ame order as in 
317a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 65  the previous ste
317b0 70 20 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e  p (using $SQL1).
317c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
317d0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f 72  QLITE_TCLAPI sor
317e0 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
317f0 65 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  elper(.  void * 
31800 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
31810 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
31820 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
31830 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
31840 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
31850 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20   char *zSql1;.  
31860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
31870 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20  2;.  int nStep; 
31880 0a 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20  .  int iStep; . 
31890 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
318a0 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 75 6e  ksum1 = 0; .  un
318b0 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75  signed int iCksu
318c0 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72  m2 = 0; .  int r
318d0 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73  c;.  int iB;.  s
318e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
318f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
31900 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  t;.  .  if( objc
31910 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
31920 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
31930 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
31940 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32   SQL1 NSTEP SQL2
31950 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
31960 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
31970 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
31980 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
31990 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
319a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
319b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
319c0 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  l1 = Tcl_GetStri
319d0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
319e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
319f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
31a00 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20  v[3], &nStep) ) 
31a10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31a20 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f  ;.  zSql2 = Tcl_
31a30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
31a40 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ]);..  rc = sqli
31a50 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
31a60 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70  b, zSql1, -1, &p
31a70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
31a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31a90 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a  goto sql_error;.
31aa0 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f  .  iB = sqlite3_
31ab0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
31ac0 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74  mt)-1;.  for(iSt
31ad0 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65  ep=0; iStep<nSte
31ae0 70 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p && SQLITE_ROW=
31af0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
31b00 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a  tmt); iStep++){.
31b10 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69      int a = sqli
31b20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
31b30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
31b40 28 20 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c  ( a!=sqlite3_col
31b50 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  umn_int(pStmt, i
31b60 42 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  B) ){.      Tcl_
31b70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
31b80 65 72 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72  erp, "data error
31b90 3a 20 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20  : (a!=b)", 0);. 
31ba0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
31bb0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
31bc0 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43    iCksum1 += (iC
31bd0 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20 28 75  ksum1 << 3) + (u
31be0 6e 73 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20  nsigned int)a;. 
31bf0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
31c00 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
31c10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
31c20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71  ITE_OK ) goto sq
31c30 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d  l_error;..  rc =
31c40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
31c50 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d  _v2(db, zSql2, -
31c60 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
31c70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31c80 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
31c90 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70  ror;.  for(iStep
31ca0 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  =0; SQLITE_ROW==
31cb0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
31cc0 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
31cd0 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
31ce0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
31cf0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b  tmt, 0);.    iCk
31d00 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32  sum2 += (iCksum2
31d10 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69 67 6e   << 3) + (unsign
31d20 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20  ed int)a;.  }.  
31d30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
31d40 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
31d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31d60 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
31d70 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75  or;..  if( iCksu
31d80 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20  m1!=iCksum2 ){. 
31d90 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
31da0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65  ult(interp, "che
31db0 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c  cksum mismatch",
31dc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
31dd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
31de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
31df0 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54  . sql_error:.  T
31e00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
31e10 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72  interp, "sql err
31e20 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
31e30 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
31e40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31e50 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  R;.}...#ifdef SQ
31e60 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
31e70 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64  TICATION.#includ
31e80 65 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75  e "sqlite3userau
31e90 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  th.h"./*.** tclc
31ea0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
31eb0 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44  r_authenticate D
31ec0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
31ed0 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ORD.*/.static in
31ee0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
31ef0 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e  test_user_authen
31f00 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  ticate(.  Client
31f10 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
31f20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
31f30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31f40 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
31f50 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
31f60 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
31f70 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
31f80 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
31f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31fa0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
31fb0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
31fc0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
31fd0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
31fe0 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
31ff0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
32000 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
32010 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 73  nPasswd = 0;.  s
32020 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
32030 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
32040 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
32050 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
32060 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
32070 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
32080 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORD");.    retur
32090 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
320a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
320b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
320c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
320d0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
320e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
320f0 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20  ;.  }.  zUser = 
32100 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
32110 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77  jv[2]);.  zPassw
32120 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
32130 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
32140 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 72  , &nPasswd);.  r
32150 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
32160 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 64 62  _authenticate(db
32170 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64  , zUser, zPasswd
32180 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63  , nPasswd);.  Tc
32190 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
321a0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
321b0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
321c0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
321d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
321e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
321f0 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
32200 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
32210 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
32220 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63  ICATION./*.** tc
32230 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
32240 73 65 72 5f 61 64 64 20 44 42 20 55 53 45 52 4e  ser_add DB USERN
32250 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
32260 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  DMIN.*/.static i
32270 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
32280 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64 28 0a   test_user_add(.
32290 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
322a0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
322b0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
322c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
322d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
322e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
322f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
32300 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
32310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32320 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
32330 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
32340 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
32350 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
32360 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
32370 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63   *zUser = 0;.  c
32380 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30  har *zPasswd = 0
32390 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20  ;.  int nPasswd 
323a0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d  = 0;.  int isAdm
323b0 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  in = 0;.  sqlite
323c0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
323d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
323e0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
323f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
32400 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45  1, objv, "DB USE
32410 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
32420 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65  SADMIN");.    re
32430 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
32440 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
32450 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
32460 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
32470 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
32480 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32490 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72  ROR;.  }.  zUser
324a0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
324b0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61  (objv[2]);.  zPa
324c0 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  sswd = Tcl_GetSt
324d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
324e0 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a  [3], &nPasswd);.
324f0 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e    Tcl_GetBoolean
32500 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
32510 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69  objv[4], &isAdmi
32520 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  n);.  rc = sqlit
32530 65 33 5f 75 73 65 72 5f 61 64 64 28 64 62 2c 20  e3_user_add(db, 
32540 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20  zUser, zPasswd, 
32550 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e  nPasswd, isAdmin
32560 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
32570 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
32580 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
32590 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
325a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
325b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
325c0 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
325d0 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  TICATION */..#if
325e0 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
325f0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
32600 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
32610 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
32620 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41  e DB USERNAME PA
32630 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a  SSWORD ISADMIN.*
32640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
32650 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
32660 75 73 65 72 5f 63 68 61 6e 67 65 28 0a 20 20 43  user_change(.  C
32670 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
32680 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
32690 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
326a0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
326b0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
326c0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
326d0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
326e0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
326f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
32700 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32710 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
32720 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
32730 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
32740 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
32750 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  User = 0;.  char
32760 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20   *zPasswd = 0;. 
32770 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30   int nPasswd = 0
32780 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20  ;.  int isAdmin 
32790 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
327a0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
327b0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
327c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
327d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
327e0 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41  objv, "DB USERNA
327f0 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ME PASSWORD ISAD
32800 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  MIN");.    retur
32810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
32820 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
32830 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
32840 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
32850 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
32860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32870 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20  ;.  }.  zUser = 
32880 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
32890 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77  jv[2]);.  zPassw
328a0 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
328b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
328c0 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54  , &nPasswd);.  T
328d0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
328e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
328f0 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b  v[4], &isAdmin);
32900 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
32910 75 73 65 72 5f 63 68 61 6e 67 65 28 64 62 2c 20  user_change(db, 
32920 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20  zUser, zPasswd, 
32930 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e  nPasswd, isAdmin
32940 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
32950 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
32960 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
32970 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
32980 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
32990 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
329a0 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
329b0 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  TICATION */..#if
329c0 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
329d0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
329e0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
329f0 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74  lite3_user_delet
32a00 65 20 44 42 20 55 53 45 52 4e 41 4d 45 0a 2a 2f  e DB USERNAME.*/
32a10 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
32a20 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75  TE_TCLAPI test_u
32a30 73 65 72 5f 64 65 6c 65 74 65 28 0a 20 20 43 6c  ser_delete(.  Cl
32a40 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
32a50 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
32a60 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
32a70 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
32a80 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
32a90 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
32aa0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
32ab0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
32ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32ad0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
32ae0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
32af0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
32b00 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
32b10 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55  */.){.  char *zU
32b20 73 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ser = 0;.  sqlit
32b30 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
32b40 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
32b50 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
32b60 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
32b70 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53   1, objv, "DB US
32b80 45 52 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  ERNAME");.    re
32b90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
32ba0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
32bb0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
32bc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
32bd0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
32be0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32bf0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72  ROR;.  }.  zUser
32c00 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
32c10 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20  (objv[2]);.  rc 
32c20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
32c30 65 6c 65 74 65 28 64 62 2c 20 7a 55 73 65 72 29  elete(db, zUser)
32c40 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
32c50 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
32c60 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
32c70 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
32c80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
32c90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
32ca0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
32cb0 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  ICATION */../*.*
32cc0 2a 20 74 63 6c 63 6d 64 3a 20 62 61 64 5f 62 65  * tclcmd: bad_be
32cd0 68 61 76 69 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a  havior TYPE.**.*
32ce0 2a 20 44 6f 20 73 6f 6d 65 20 74 68 69 6e 67 73  * Do some things
32cf0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 74 72 69   that should tri
32d00 67 67 65 72 20 61 20 76 61 6c 67 72 69 6e 64 20  gger a valgrind 
32d10 6f 72 20 2d 66 73 61 6e 69 74 69 7a 65 3d 75 6e  or -fsanitize=un
32d20 64 65 66 69 6e 65 64 0a 2a 2a 20 77 61 72 6e 69  defined.** warni
32d30 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ng.  This is use
32d40 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
32d50 20 65 72 72 6f 72 73 20 61 6e 64 20 77 61 72 6e   errors and warn
32d60 69 6e 67 73 20 6f 75 74 70 75 74 20 62 79 20 74  ings output by t
32d70 68 6f 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72  hose.** tools ar
32d80 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
32d90 65 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a  e test scripts..
32da0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 59 50 45  **.**       TYPE
32db0 20 20 20 20 20 20 20 42 45 48 41 56 49 4f 52 0a         BEHAVIOR.
32dc0 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 20  **       1      
32dd0 20 20 20 20 4f 76 65 72 66 6c 6f 77 20 61 20 73      Overflow a s
32de0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
32df0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
32e00 20 20 4a 75 6d 70 20 62 61 73 65 64 20 6f 6e 20    Jump based on 
32e10 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
32e20 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20   variable.**    
32e30 20 20 20 33 20 20 20 20 20 20 20 20 20 20 52 65     3          Re
32e40 61 64 20 61 66 74 65 72 20 66 72 65 65 0a 2a 2a  ad after free.**
32e50 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
32e60 20 20 50 61 6e 69 63 0a 2a 2f 0a 73 74 61 74 69    Panic.*/.stati
32e70 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
32e80 41 50 49 20 74 65 73 74 5f 62 61 64 5f 62 65 68  API test_bad_beh
32e90 61 76 69 6f 72 28 0a 20 20 43 6c 69 65 6e 74 44  avior(.  ClientD
32ea0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
32eb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e  /* Pointer to an
32ec0 20 69 6e 74 65 67 65 72 20 63 6f 6e 74 61 69 6e   integer contain
32ed0 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 54 63  ing zero */.  Tc
32ee0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
32ef0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
32f00 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
32f10 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
32f20 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
32f30 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
32f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
32f50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
32f60 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
32f70 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
32f80 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
32f90 20 20 69 6e 74 20 69 54 79 70 65 3b 0a 20 20 69    int iType;.  i
32fa0 6e 74 20 78 79 7a 3b 0a 20 20 69 6e 74 20 69 20  nt xyz;.  int i 
32fb0 3d 20 2a 28 69 6e 74 2a 29 63 6c 69 65 6e 74 44  = *(int*)clientD
32fc0 61 74 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ata;.  int j;.  
32fd0 69 6e 74 20 77 5b 31 30 5d 3b 0a 20 20 69 6e 74  int w[10];.  int
32fe0 20 2a 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   *a;.  if( objc!
32ff0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
33000 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
33010 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 59 50  p, 1, objv, "TYP
33020 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
33030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
33040 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
33050 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
33060 62 6a 76 5b 31 5d 2c 20 26 69 54 79 70 65 29 20  bjv[1], &iType) 
33070 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
33080 4f 52 3b 0a 20 20 73 77 69 74 63 68 28 20 69 54  OR;.  switch( iT
33090 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
330a0 31 3a 20 7b 0a 20 20 20 20 20 20 78 79 7a 20 3d  1: {.      xyz =
330b0 20 30 78 37 66 66 66 66 66 30 30 20 2d 20 69 3b   0x7fffff00 - i;
330c0 0a 20 20 20 20 20 20 78 79 7a 20 2b 3d 20 30 78  .      xyz += 0x
330d0 31 30 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  100;.      Tcl_S
330e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
330f0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
33100 6a 28 78 79 7a 29 29 3b 0a 20 20 20 20 20 20 62  j(xyz));.      b
33110 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
33120 63 61 73 65 20 32 3a 20 7b 0a 20 20 20 20 20 20  case 2: {.      
33130 77 5b 31 5d 20 3d 20 35 3b 0a 20 20 20 20 20 20  w[1] = 5;.      
33140 69 66 28 20 77 5b 69 5d 3e 30 20 29 20 77 5b 31  if( w[i]>0 ) w[1
33150 5d 2b 2b 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ]++;.      Tcl_S
33160 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
33170 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
33180 6a 28 77 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  j(w[1]));.      
33190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
331a0 20 63 61 73 65 20 33 3a 20 7b 0a 20 20 20 20 20   case 3: {.     
331b0 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a   a = malloc( siz
331c0 65 6f 66 28 69 6e 74 29 2a 31 30 20 29 3b 0a 20  eof(int)*10 );. 
331d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
331e0 31 30 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20  10; j++) a[j] = 
331f0 6a 3b 0a 20 20 20 20 20 20 66 72 65 65 28 61 29  j;.      free(a)
33200 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
33210 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
33220 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
33230 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65  [i]));.      bre
33240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
33250 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 54 63  se 4: {.      Tc
33260 6c 5f 50 61 6e 69 63 28 22 44 65 6c 69 62 65 72  l_Panic("Deliber
33270 61 74 65 20 70 61 6e 69 63 22 29 3b 0a 20 20 20  ate panic");.   
33280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
33290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
332a0 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}  ../*.** 
332b0 74 63 6c 63 6d 64 3a 20 20 20 72 65 67 69 73 74  tclcmd:   regist
332c0 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20 44  er_dbstat_vtab D
332d0 42 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 74 68  B.**.** Cause th
332e0 65 20 64 62 73 74 61 74 20 76 69 72 74 75 61 6c  e dbstat virtual
332f0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 76 61   table to be ava
33300 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 63 6f  ilable on the co
33310 6e 6e 65 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73  nnection DB.*/.s
33320 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
33330 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 67  _TCLAPI test_reg
33340 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61  ister_dbstat_vta
33350 62 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  b(.  void *clien
33360 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
33370 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
33380 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
33390 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
333a0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
333b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
333c0 42 4c 45 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  BLE.  Tcl_Append
333d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
333e0 64 62 73 74 61 74 20 6e 6f 74 20 61 76 61 69 6c  dbstat not avail
333f0 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20  able because of 
33400 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33410 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51               "SQ
33420 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
33430 4c 54 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29  LTABLE", (void*)
33440 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
33450 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
33460 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
33470 7b 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d  { sqlite3 *db; }
33480 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
33490 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
334a0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Info;..  if( obj
334b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
334c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
334d0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
334e0 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
334f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
33500 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
33510 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
33520 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d    if( Tcl_GetCom
33530 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
33540 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20   zDb, &cmdInfo) 
33550 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20  ){.    sqlite3* 
33560 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
33570 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
33580 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
33590 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  db;.    sqlite3D
335a0 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62  bstatRegister(db
335b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
335c0 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  TCL_OK;.#endif /
335d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
335e0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a  RTUALTABLE */.}.
335f0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
33600 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
33610 69 67 20 44 42 20 53 45 54 54 49 4e 47 20 56 41  ig DB SETTING VA
33620 4c 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  LUE.**.** Invoke
33630 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
33640 69 67 28 29 20 66 6f 72 20 6f 6e 65 20 6f 66 20  ig() for one of 
33650 74 68 65 20 73 65 74 74 69 6e 67 20 76 61 6c 75  the setting valu
33660 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
33670 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
33680 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f  test_sqlite3_db_
33690 63 6f 6e 66 69 67 28 0a 20 20 76 6f 69 64 20 2a  config(.  void *
336a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
336b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
336c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
336d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
336e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
336f0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
33700 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33710 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
33720 65 56 61 6c 3b 0a 20 20 7d 20 61 53 65 74 74 69  eVal;.  } aSetti
33730 6e 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ng[] = {.    { "
33740 46 4b 45 59 22 2c 20 20 20 20 20 20 20 20 20 20  FKEY",          
33750 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
33760 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 7d 2c  G_ENABLE_FKEY },
33770 0a 20 20 20 20 7b 20 22 54 52 49 47 47 45 52 22  .    { "TRIGGER"
33780 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
33790 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
337a0 5f 54 52 49 47 47 45 52 20 7d 2c 0a 20 20 20 20  _TRIGGER },.    
337b0 7b 20 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  { "FTS3_TOKENIZE
337c0 52 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f  R",  SQLITE_DBCO
337d0 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
337e0 5f 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20  _TOKENIZER },.  
337f0 20 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53    { "LOAD_EXTENS
33800 49 4f 4e 22 2c 20 20 53 51 4c 49 54 45 5f 44 42  ION",  SQLITE_DB
33810 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f  CONFIG_ENABLE_LO
33820 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a  AD_EXTENSION },.
33830 20 20 20 20 7b 20 22 4e 4f 5f 43 4b 50 54 5f 4f      { "NO_CKPT_O
33840 4e 5f 43 4c 4f 53 45 22 2c 53 51 4c 49 54 45 5f  N_CLOSE",SQLITE_
33850 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
33860 5f 4f 4e 5f 43 4c 4f 53 45 20 7d 2c 0a 20 20 20  _ON_CLOSE },.   
33870 20 7b 20 22 51 50 53 47 22 2c 20 20 20 20 20 20   { "QPSG",      
33880 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
33890 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53  ONFIG_ENABLE_QPS
338a0 47 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  G },.  };.  int 
338b0 69 3b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 63 6f  i;.  int v;.  co
338c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 74 74 69  nst char *zSetti
338d0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ng;.  sqlite3 *d
338e0 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
338f0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
33900 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
33910 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53  , 1, objv, "DB S
33920 45 54 54 49 4e 47 20 56 41 4c 55 45 22 29 3b 0a  ETTING VALUE");.
33930 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
33940 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
33950 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
33960 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
33970 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
33980 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
33990 52 52 4f 52 3b 0a 20 20 7a 53 65 74 74 69 6e 67  RROR;.  zSetting
339a0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
339b0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
339c0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
339d0 28 22 53 51 4c 49 54 45 5f 2a 22 2c 20 7a 53 65  ("SQLITE_*", zSe
339e0 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
339f0 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 69 66 28  ting += 7;.  if(
33a00 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
33a10 28 22 44 42 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a  ("DBCONFIG_*", z
33a20 53 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53  Setting)==0 ) zS
33a30 65 74 74 69 6e 67 20 2b 3d 20 39 3b 0a 20 20 69  etting += 9;.  i
33a40 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
33a50 6f 62 28 22 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a  ob("ENABLE_*", z
33a60 53 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53  Setting)==0 ) zS
33a70 65 74 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 66  etting += 7;.  f
33a80 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
33a90 69 7a 65 28 61 53 65 74 74 69 6e 67 29 3b 20 69  ize(aSetting); i
33aa0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
33ab0 63 6d 70 28 7a 53 65 74 74 69 6e 67 2c 20 61 53  cmp(zSetting, aS
33ac0 65 74 74 69 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29  etting[i].zName)
33ad0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
33ae0 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53  .  if( i>=ArrayS
33af0 69 7a 65 28 61 53 65 74 74 69 6e 67 29 20 29 7b  ize(aSetting) ){
33b00 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
33b10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20  esult(interp,.  
33b20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
33b30 67 4f 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 73 71  gObj("unknown sq
33b40 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20  lite3_db_config 
33b50 73 65 74 74 69 6e 67 22 2c 20 2d 31 29 29 3b 0a  setting", -1));.
33b60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
33b70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
33b80 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
33b90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
33ba0 5d 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  ], &v) ) return 
33bb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
33bc0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
33bd0 62 2c 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 65  b, aSetting[i].e
33be0 56 61 6c 2c 20 76 2c 20 26 76 29 3b 0a 20 20 54  Val, v, &v);.  T
33bf0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
33c00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
33c10 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 72 65 74  ntObj(v));.  ret
33c20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
33c30 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
33c40 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  name of the main
33c50 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
33c60 20 66 72 6f 6d 20 22 6d 61 69 6e 22 20 74 6f 20   from "main" to 
33c70 22 69 63 65 63 75 62 65 22 2e 0a 2a 2f 0a 73 74  "icecube"..*/.st
33c80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
33c90 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62 63 6f  TCLAPI test_dbco
33ca0 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f  nfig_maindbname_
33cb0 69 63 65 63 75 62 65 28 0a 20 20 76 6f 69 64 20  icecube(.  void 
33cc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
33cd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
33ce0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
33cf0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
33d00 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
33d10 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
33d20 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  db;.  extern int
33d30 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
33d40 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74  l_Interp*, const
33d50 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a   char*, sqlite3*
33d60 2a 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  *);.  if( objc!=
33d70 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
33d80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
33d90 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
33da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
33db0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
33dc0 0a 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f  .    if( getDbPo
33dd0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
33de0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
33df0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
33e00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
33e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
33e20 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
33e30 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
33e40 49 4e 44 42 4e 41 4d 45 2c 20 22 69 63 65 63 75  INDBNAME, "icecu
33e50 62 65 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  be");.    Tcl_Se
33e60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
33e70 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
33e80 28 72 63 29 29 3b 0a 20 20 20 20 72 65 74 75 72  (rc));.    retur
33e90 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  n TCL_OK;.  }.}.
33ea0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
33eb0 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d 20  lite3_mmap_warm 
33ec0 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61  DB DBNAME.*/.sta
33ed0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
33ee0 43 4c 41 50 49 20 74 65 73 74 5f 6d 6d 61 70 5f  CLAPI test_mmap_
33ef0 77 61 72 6d 28 0a 20 20 76 6f 69 64 20 2a 20 63  warm(.  void * c
33f00 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
33f10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
33f20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
33f30 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
33f40 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e  jv[].){.  extern
33f50 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65   int getDbPointe
33f60 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63  r(Tcl_Interp*, c
33f70 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69  onst char*, sqli
33f80 74 65 33 2a 2a 29 3b 0a 20 20 65 78 74 65 72 6e  te3**);.  extern
33f90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 6d 61   int sqlite3_mma
33fa0 70 5f 77 61 72 6d 28 73 71 6c 69 74 65 33 20 2a  p_warm(sqlite3 *
33fb0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
33fc0 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  );..  if( objc!=
33fd0 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
33fe0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
33ff0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
34000 6f 62 6a 76 2c 20 22 44 42 20 3f 44 42 4e 41 4d  objv, "DB ?DBNAM
34010 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
34020 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
34030 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
34040 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
34050 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
34060 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 69   *zDb = 0;.    i
34070 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
34080 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
34090 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
340a0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
340b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
340c0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
340d0 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
340e0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
340f0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
34100 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d  qlite3_mmap_warm
34110 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 54  (db, zDb);.    T
34120 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
34130 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
34140 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
34150 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
34160 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
34170 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L_OK;.  }.}../*.
34180 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
34190 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
341a0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
341b0 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
341c0 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
341d0 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78  p *interp){.  ex
341e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
341f0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20  _search_count;. 
34200 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
34210 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b  te3_found_count;
34220 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
34230 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
34240 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
34250 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
34260 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _file_count;.  e
34270 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
34280 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20  3_sort_count;.  
34290 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
342a0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b  e3_current_time;
342b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
342c0 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f  NIX && defined(_
342d0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
342e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
342f0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72  NG_STYLE.  exter
34300 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  n int sqlite3_ho
34310 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66  stid_num;.#endif
34320 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
34330 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
34340 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ze;.  extern int
34350 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
34360 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65  qlite3BtreeShare
34370 64 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69  dCacheReport(voi
34380 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d*,.            
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
343b0 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63  l_Interp*,int,Tc
343c0 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20  l_Obj*CONST*);. 
343d0 20 73 74 61 74 69 63 20 69 6e 74 20 69 5a 65 72   static int iZer
343e0 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  o = 0;.  static 
343f0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
34400 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
34410 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
34420 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
34430 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
34440 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
34450 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
34460 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
34470 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
34480 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
34490 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
344a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
344b0 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
344c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
344d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
344e0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
344f0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
34500 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
34510 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
34520 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34530 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
34540 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
34550 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
34560 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
34570 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34580 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22  e3_mprintf_long"
34590 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
345a0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
345b0 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20  _mprintf_long   
345c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
345d0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
345e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
345f0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
34600 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
34610 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34620 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
34630 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
34640 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
34650 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
34660 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34670 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
34680 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
34690 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
346a0 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
346b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
346c0 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
346d0 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
346e0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
346f0 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
34700 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34710 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
34720 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
34730 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
34740 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
34750 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34760 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
34770 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
34780 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
34790 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
347a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
347b0 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
347c0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
347d0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
347e0 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
347f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34800 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
34810 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
34820 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
34830 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
34840 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34850 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
34860 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
34870 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
34880 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
34890 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
348a0 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
348b0 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
348c0 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
348d0 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
348e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
348f0 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
34900 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
34910 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
34920 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
34930 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
34940 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20  ec_hex",        
34950 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
34960 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65  oc*)test_exec_he
34970 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  x         },.   
34980 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
34990 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
349a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
349b0 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
349c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
349d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
349e0 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
349f0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
34a00 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
34a10 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
34a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
34a30 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
34a40 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
34a50 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
34a60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
34a70 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
34a80 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
34a90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
34aa0 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
34ab0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
34ac0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
34ad0 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
34ae0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
34af0 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  ose_v2",        
34b00 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
34b10 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
34b20 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20  close_v2  },.   
34b30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
34b40 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
34b50 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
34b60 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
34b70 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
34b80 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
34b90 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
34ba0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
34bb0 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
34bc0 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
34bd0 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
34be0 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
34bf0 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
34c00 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
34c10 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
34c20 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
34c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c40 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
34c50 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
34c60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
34c70 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20  "sqlite_bind",  
34c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c90 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
34ca0 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20  est_bind        
34cb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
34cc0 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20  breakpoint",    
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34cf0 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20  st_breakpoint   
34d00 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
34d10 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20  qlite3_key",    
34d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
34d30 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
34d40 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  t_key           
34d50 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
34d60 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20  lite3_rekey",   
34d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
34d80 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
34d90 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20  _rekey          
34da0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
34db0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20  ite_set_magic", 
34dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
34dd0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
34de0 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20  e_set_magic     
34df0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
34e00 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20  te3_interrupt", 
34e10 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
34e20 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
34e30 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20  nterrupt        
34e40 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34e50 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
34e60 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  n",        (Tcl_
34e70 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
34e80 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d  function       }
34e90 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34ea0 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
34eb0 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
34ec0 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63  mdProc*)delete_c
34ed0 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c  ollation      },
34ee0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34ef0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22  _get_autocommit"
34f00 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
34f10 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63  dProc*)get_autoc
34f20 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a  ommit        },.
34f30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34f40 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
34f50 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
34f60 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
34f70 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
34f80 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fa0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
34fb0 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
34fc0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
34fd0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54     { "sqlite3IoT
34fe0 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
34ff0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
35000 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20  *)test_io_trace 
35010 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
35020 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a  { "clang_sanitiz
35030 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20  e_address",     
35040 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
35050 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f  )clang_sanitize_
35060 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a  address },.  };.
35070 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
35080 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
35090 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
350a0 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
350b0 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
350c0 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
350d0 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
350e0 22 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  "sqlite3_db_conf
350f0 69 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ig",            
35100 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62   test_sqlite3_db
35110 5f 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 20 20  _config, 0 },.  
35120 20 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76 69     { "bad_behavi
35130 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
35140 20 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f 62        test_bad_b
35150 65 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64 2a  ehavior,  (void*
35160 29 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20 20  )&iZero },.     
35170 7b 20 22 72 65 67 69 73 74 65 72 5f 64 62 73 74  { "register_dbst
35180 61 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20 20  at_vtab",       
35190 20 20 20 74 65 73 74 5f 72 65 67 69 73 74 65 72     test_register
351a0 5f 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d 2c  _dbstat_vtab  },
351b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
351c0 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
351d0 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c  ter",    get_sql
351e0 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d  ite_pointer, 0 }
351f0 2c 0a 20 20 20 20 20 7b 20 22 69 6e 74 61 72 72  ,.     { "intarr
35200 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20  ay_addr",       
35210 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
35220 6e 74 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20  ntarray_addr, 0 
35230 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 74 36 34  },.     { "int64
35240 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20  array_addr",    
35250 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35260 69 6e 74 36 34 61 72 72 61 79 5f 61 64 64 72 2c  int64array_addr,
35270 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 6f   0 },.     { "do
35280 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 22 2c  ublearray_addr",
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
352a0 73 74 5f 64 6f 75 62 6c 65 61 72 72 61 79 5f 61  st_doublearray_a
352b0 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ddr, 0 },.     {
352c0 20 22 74 65 78 74 61 72 72 61 79 5f 61 64 64 72   "textarray_addr
352d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
352e0 20 20 74 65 73 74 5f 74 65 78 74 61 72 72 61 79    test_textarray
352f0 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20  _addr, 0 },.    
35300 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
35310 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
35320 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
35330 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
35340 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
35350 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
35360 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
35370 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
35380 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
35390 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 22 2c 20  nd_zeroblob64", 
353a0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
353b0 7a 65 72 6f 62 6c 6f 62 36 34 2c 20 30 20 7d 2c  zeroblob64, 0 },
353c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
353d0 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
353e0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
353f0 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
35400 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35410 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
35420 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
35430 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
35440 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35450 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
35460 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35470 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
35480 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35490 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
354a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
354b0 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
354c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
354d0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
354e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
354f0 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
35500 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
35510 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
35520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
35530 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
35540 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
35550 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
35560 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74  meter_count",  t
35570 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
35580 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20  er_count, 0},.  
35590 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
355a0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
355b0 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f  e",   test_bind_
355c0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20  parameter_name, 
355d0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
355e0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
355f0 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73  ter_index",  tes
35600 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
35610 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20  _index, 0},.    
35620 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61   { "sqlite3_clea
35630 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
35640 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62      test_clear_b
35650 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20  indings, 0},.   
35660 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65    { "sqlite3_sle
35670 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
35680 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c       test_sleep,
35690 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20            0},.  
356a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
356b0 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  rcode",         
356c0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f        test_errco
356d0 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  de       ,0 },. 
356e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
356f0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22  xtended_errcode"
35700 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65  ,      test_ex_e
35710 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a  rrcode    ,0 },.
35720 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35730 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
35740 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
35750 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
35760 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35770 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
35780 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
35790 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
357a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
357b0 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
357c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
357d0 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
357e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
357f0 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
35800 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35810 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
35820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35830 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20  te3_open_v2",   
35840 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
35850 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c  _open_v2       ,
35860 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35870 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22  ite3_complete16"
35880 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
35890 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20  t_complete16    
358a0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
358b0 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 22  lite3_normalize"
358c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
358d0 73 74 5f 6e 6f 72 6d 61 6c 69 7a 65 20 20 20 20  st_normalize    
358e0 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22   ,0 },..     { "
358f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22  sqlite3_prepare"
35900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35910 74 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20  test_prepare    
35920 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
35930 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
35940 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
35950 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20   test_prepare16 
35960 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
35970 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
35980 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
35990 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76    test_prepare_v
359a0 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  2    ,0 },.     
359b0 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
359c0 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20  re_tkt3134",    
359d0 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f     test_prepare_
359e0 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20  tkt3134, 0},.   
359f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
35a00 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20  pare16_v2",     
35a10 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
35a20 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20  e16_v2  ,0 },.  
35a30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
35a40 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
35a50 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
35a60 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
35a70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
35a80 74 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20  tmt_status",    
35a90 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
35aa0 5f 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a  _status   ,0 },.
35ab0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35ac0 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  reset",         
35ad0 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73          test_res
35ae0 65 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  et         ,0 },
35af0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35b00 5f 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20  _expired",      
35b10 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78           test_ex
35b20 70 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d  pired       ,0 }
35b30 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35b40 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
35b50 6e 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74  ngs",     test_t
35b60 72 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20  ransfer_bind ,0 
35b70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35b80 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  e3_changes",    
35b90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35ba0 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30  changes       ,0
35bb0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35bc0 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20  te3_step",      
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
35be0 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c  _step          ,
35bf0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35c00 69 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20  ite3_sql",      
35c10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
35c20 74 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20  t_sql           
35c30 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
35c40 6c 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73  lite3_expanded_s
35c50 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  ql",          te
35c60 73 74 5f 65 78 5f 73 71 6c 20 20 20 20 20 20 20  st_ex_sql       
35c70 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
35c80 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74  qlite3_next_stmt
35c90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
35ca0 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20  est_next_stmt   
35cb0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
35cc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
35cd0 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20  donly",         
35ce0 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  test_stmt_readon
35cf0 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ly ,0 },.     { 
35d00 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75  "sqlite3_stmt_bu
35d10 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
35d20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20   test_stmt_busy 
35d30 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
35d40 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72   "uses_stmt_jour
35d50 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  nal",           
35d60 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72    uses_stmt_jour
35d70 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20  nal ,0 },..     
35d80 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  { "sqlite3_relea
35d90 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20  se_memory",     
35da0 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f     test_release_
35db0 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a  memory,     0},.
35dc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35dd0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
35de0 79 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f  y",     test_db_
35df0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20  release_memory, 
35e00 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
35e10 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
35e20 73 68 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  sh",         tes
35e30 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 2c  t_db_cacheflush,
35e40 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
35e50 20 22 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d   "sqlite3_system
35e60 5f 65 72 72 6e 6f 22 2c 20 20 20 20 20 20 20 20  _errno",        
35e70 20 20 74 65 73 74 5f 73 79 73 74 65 6d 5f 65 72    test_system_er
35e80 72 6e 6f 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  rno,       0},. 
35e90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
35ea0 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20  b_filename",    
35eb0 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66         test_db_f
35ec0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
35ed0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
35ee0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22  te3_db_readonly"
35ef0 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
35f00 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20  _db_readonly,   
35f10 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
35f20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
35f30 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
35f40 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
35f50 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
35f60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
35f70 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
35f80 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
35f90 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
35fa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35fb0 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
35fc0 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
35fd0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
35fe0 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
35ff0 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
36000 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
36010 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
36020 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
36030 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
36040 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
36050 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
36060 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
36070 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36080 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
36090 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
360a0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
360b0 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
360c0 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
360d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
360e0 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
360f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
36100 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 63 6f 6e  },.     { "dbcon
36110 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f 69  fig_maindbname_i
36120 63 65 63 75 62 65 22 2c 20 20 20 74 65 73 74 5f  cecube",   test_
36130 64 62 63 6f 6e 66 69 67 5f 6d 61 69 6e 64 62 6e  dbconfig_maindbn
36140 61 6d 65 5f 69 63 65 63 75 62 65 20 7d 2c 0a 0a  ame_icecube },..
36150 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e       { "save_prn
36160 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
36170 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e          save_prn
36180 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c  g_state,    0 },
36190 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65  .     { "restore
361a0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
361b0 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65           restore
361c0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d  _prng_state, 0 }
361d0 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f  ,.     { "reset_
361e0 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
361f0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74 5f            reset_
36200 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20  prng_state,   0 
36210 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62  },.     { "datab
36220 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70  ase_never_corrup
36230 74 22 2c 20 20 20 20 20 20 20 20 64 61 74 61 62  t",        datab
36240 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70  ase_never_corrup
36250 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64  t, 0},.     { "d
36260 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
36270 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 64  orrupt",       d
36280 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
36290 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20  orrupt, 0},.    
362a0 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   { "optimization
362b0 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20  _control",      
362c0 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e      optimization
362d0 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66  _control,0},.#if
362e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
362f0 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33      { "lock_win3
36300 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20  2_file",        
36310 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6c         win32_fil
36320 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a  e_lock,    0 },.
36330 20 20 20 20 20 7b 20 22 65 78 69 73 74 73 5f 77       { "exists_w
36340 69 6e 33 32 5f 70 61 74 68 22 2c 20 20 20 20 20  in32_path",     
36350 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 65 78          win32_ex
36360 69 73 74 73 5f 70 61 74 68 2c 20 20 30 20 7d 2c  ists_path,  0 },
36370 0a 20 20 20 20 20 7b 20 22 66 69 6e 64 5f 77 69  .     { "find_wi
36380 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
36390 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66           win32_f
363a0 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30 20 7d  ind_file,    0 }
363b0 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c 65 74 65  ,.     { "delete
363c0 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
363d0 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
363e0 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20 30 20  delete_file,  0 
363f0 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b 65 5f  },.     { "make_
36400 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20  win32_dir",     
36410 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
36420 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 30  _mkdir,        0
36430 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 6d 6f   },.     { "remo
36440 76 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20  ve_win32_dir",  
36450 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
36460 32 5f 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  2_rmdir,        
36470 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 },.#endif.    
36480 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22   { "tcl_objproc"
36490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
364a0 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63      runAsObjProc
364b0 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20  ,       0 },..  
364c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f     /* sqlite3_co
364d0 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a  lumn_*() API */.
364e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
364f0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20  column_count",  
36500 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
36510 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c  umn_count  ,0 },
36520 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36530 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20  _data_count",   
36540 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61           test_da
36550 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d  ta_count    ,0 }
36560 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36570 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20  3_column_type", 
36580 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
36590 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20  olumn_type   ,0 
365a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
365b0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c  e3_column_blob",
365c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
365d0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30  column_blob   ,0
365e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
365f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
36600 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  e",         test
36610 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c  _column_double ,
36620 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
36630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
36640 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  4",          tes
36650 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20  t_column_int64  
36660 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
36670 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
36680 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  t",   test_stmt_
36690 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71  utf8,  (void*)sq
366a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
366b0 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  t },.     { "sql
366c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
366d0 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",   test_stmt_u
366e0 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c  tf8,  (void*)sql
366f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
36700 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36710 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c  te3_column_int",
36720 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
36730 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  t,   (void*)sqli
36740 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20  te3_column_int  
36750 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36760 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22  e3_column_bytes"
36770 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ,  test_stmt_int
36780 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  ,   (void*)sqlit
36790 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d  e3_column_bytes}
367a0 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
367b0 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
367c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
367d0 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c  olumn_decltype",
367e0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
367f0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
36800 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a  lumn_decltype},.
36810 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
36820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
36830 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73  MN_METADATA.{ "s
36840 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
36850 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73  tabase_name",tes
36860 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
36870 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
36880 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d  n_database_name}
36890 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
368a0 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c  umn_table_name",
368b0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
368c0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
368d0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d  lumn_table_name}
368e0 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
368f0 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22  umn_origin_name"
36900 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
36910 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
36920 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
36930 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  e},.#endif..#ifn
36940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36950 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71  UTF16.     { "sq
36960 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
36970 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  es16", test_stmt
36980 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c  _int, (void*)sql
36990 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
369a0 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s16 },.     { "s
369b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
369c0 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d  xt16",  test_stm
369d0 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
369e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
369f0 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22  ext16},.     { "
36a00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
36a10 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74  ame16",  test_st
36a20 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
36a30 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
36a40 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20  name16},.     { 
36a50 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74  "add_alignment_t
36a60 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c  est_collations",
36a70 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
36a80 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20  est_collations, 
36a90 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65  0      },.#ifnde
36aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
36ab0 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
36ac0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
36ad0 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73  cltype16",test_s
36ae0 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a  tmt_utf16,(void*
36af0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
36b00 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e  decltype16},.#en
36b10 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36b20 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
36b30 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74  METADATA.{"sqlit
36b40 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
36b50 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65  se_name16",.  te
36b60 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
36b70 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
36b80 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
36b90 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33  me16},.{"sqlite3
36ba0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
36bb0 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  me16", test_stmt
36bc0 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
36bd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
36be0 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ble_name16},.{"s
36bf0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
36c00 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65  igin_name16", te
36c10 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
36c20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
36c30 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
36c40 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  16},.#endif.#end
36c50 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
36c60 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
36c70 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
36c80 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
36c90 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  2, 0 },.     { "
36ca0 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
36cb0 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73  ecover",     tes
36cc0 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
36cd0 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  , 0   },.     { 
36ce0 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69  "working_64bit_i
36cf0 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f  nt",          wo
36d00 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c  rking_64bit_int,
36d10 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
36d20 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73   "vfs_unlink_tes
36d30 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 76  t",            v
36d40 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20  fs_unlink_test, 
36d50 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
36d60 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  { "vfs_initfail_
36d70 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
36d80 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
36d90 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
36da0 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74   { "vfs_unregist
36db0 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  er_all",        
36dc0 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
36dd0 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  all,  0   },.   
36de0 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73    { "vfs_reregis
36df0 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
36e00 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
36e10 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
36e20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
36e30 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  ol_test",       
36e40 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
36e50 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
36e60 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
36e70 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
36e80 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
36e90 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
36ea0 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
36eb0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c   "file_control_l
36ec0 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20  ockproxy_test", 
36ed0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
36ee0 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20  kproxy_test,  0 
36ef0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
36f00 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
36f10 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f  ize_test", file_
36f20 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
36f30 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a  e_test,  0   },.
36f40 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
36f50 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
36f60 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72  st",  file_contr
36f70 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
36f80 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53  ,   0   },.#if S
36f90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20  QLITE_OS_WIN.   
36fa0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
36fb0 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
36fc0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
36fd0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20  win32_av_retry, 
36fe0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
36ff0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
37000 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 22 2c 20  32_get_handle", 
37010 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
37020 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 2c 20 30  32_get_handle, 0
37030 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
37040 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
37050 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69 6c  set_handle", fil
37060 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
37070 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20 7d  set_handle, 0  }
37080 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
37090 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65  "file_control_pe
370a0 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66  rsist_wal",    f
370b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
370c0 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20  ist_wal,     0  
370d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
370e0 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
370f0 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69  fe_overwrite",fi
37100 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
37110 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30  safe_overwrite,0
37120 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
37130 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22  control_vfsname"
37140 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f  ,        file_co
37150 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20  ntrol_vfsname,  
37160 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20         0   },.  
37170 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
37180 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 22  ol_tempfilename"
37190 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ,   file_control
371a0 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20 20  _tempfilename,  
371b0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
371c0 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73  "sqlite3_vfs_lis
371d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66  t",           vf
371e0 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20  s_list,     0   
371f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
37200 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
37210 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65  on_v2", test_cre
37220 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c  ate_function_v2,
37230 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46   0 },..     /* F
37240 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73  unctions from os
37250 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .h */.#ifndef SQ
37260 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
37270 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
37280 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20  _collate",      
37290 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20    test_collate, 
372a0 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  0            },.
372b0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
372c0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22  _collate_needed"
372d0 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
372e0 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a  eeded, 0     },.
372f0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
37300 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
37310 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c    test_function,
37320 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a   0           },.
37330 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
37340 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
37350 65 22 2c 20 20 20 20 74 65 73 74 5f 75 74 66 31  e",    test_utf1
37360 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c 20 30 20  6bin_collate, 0 
37370 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
37380 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37390 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
373a0 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
373b0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
373c0 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
373d0 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
373e0 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
373f0 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
37400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37410 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
37420 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
37430 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
37440 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
37450 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
37460 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37470 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
37480 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
37490 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
374a0 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
374b0 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
374c0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
374d0 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
374e0 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
374f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37500 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
37510 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74  _metadata", test
37520 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
37530 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 69  tadata, 0  },.#i
37540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37550 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
37560 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
37570 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c  reopen", test_bl
37580 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c  ob_reopen, 0  },
37590 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
375a0 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20  pcache_stats",  
375b0 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65       test_pcache
375c0 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69  _stats, 0  },.#i
375d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
375e0 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
375f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37600 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  _unlock_notify",
37610 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
37620 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ify, 0  },.#endi
37630 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
37640 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
37650 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68  ",   test_wal_ch
37660 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a  eckpoint, 0  },.
37670 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37680 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
37690 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  2",test_wal_chec
376a0 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c  kpoint_v2, 0  },
376b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
376c0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
376d0 69 6e 74 22 2c 74 65 73 74 5f 77 61 6c 5f 61 75  int",test_wal_au
376e0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20  tocheckpoint, 0 
376f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74   },.     { "test
37700 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20  _sqlite3_log",  
37710 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
37720 74 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23  te3_log, 0  },.#
37730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37740 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20  IT_EXPLAIN.     
37750 7b 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e  { "print_explain
37760 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65  _query_plan", te
37770 73 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20  st_print_eqp, 0 
37780 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
37790 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
377a0 63 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74  control", test_t
377b0 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23  est_control },.#
377c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
377d0 58 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73  X.     { "getrus
377e0 61 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75  age", test_getru
377f0 73 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  sage },.#endif. 
37800 20 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74      { "load_stat
37810 69 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74  ic_extension", t
37820 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
37830 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20  nsionCmd },.    
37840 20 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f   { "sorter_test_
37850 66 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65  fakeheap", sorte
37860 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20  r_test_fakeheap 
37870 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65  },.     { "sorte
37880 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
37890 70 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73  per", sorter_tes
378a0 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d  t_sort4_helper }
378b0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
378c0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
378d0 49 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  ION.     { "sqli
378e0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
378f0 69 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73 65  icate", test_use
37900 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c 20  r_authenticate, 
37910 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37920 69 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c 20  ite3_user_add", 
37930 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 75 73           test_us
37940 65 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20 20  er_add,         
37950 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
37960 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
37970 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75  e",       test_u
37980 73 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20 20  ser_change,     
37990 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
379a0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
379b0 74 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  te",       test_
379c0 75 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20 20  user_delete,    
379d0 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
379e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
379f0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
37a00 54 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  TUS.     { "sqli
37a10 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
37a20 74 75 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  tus",       test
37a30 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
37a40 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
37a50 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63  "sqlite3_stmt_sc
37a60 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22 2c  anstatus_reset",
37a70 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73   test_stmt_scans
37a80 74 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20 30  tatus_reset,   0
37a90 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   },.#endif.#ifde
37aa0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37ab0 53 51 4c 4c 4f 47 0a 20 20 20 20 20 7b 20 22 73  SQLLOG.     { "s
37ac0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 71  qlite3_config_sq
37ad0 6c 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74  llog",         t
37ae0 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f  est_config_sqllo
37af0 67 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66  g,   0 },.#endif
37b00 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 63 75 72  .     { "vfs_cur
37b10 72 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34 22  rent_time_int64"
37b20 2c 20 20 20 20 20 20 20 20 20 20 20 76 66 73 43  ,           vfsC
37b30 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
37b40 20 20 20 30 20 7d 2c 0a 23 69 66 64 65 66 20 53     0 },.#ifdef S
37b50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
37b60 50 53 48 4f 54 0a 20 20 20 20 20 7b 20 22 73 71  PSHOT.     { "sq
37b70 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
37b80 65 74 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68  et", test_snapsh
37b90 6f 74 5f 67 65 74 2c 20 30 20 7d 2c 0a 20 20 20  ot_get, 0 },.   
37ba0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61    { "sqlite3_sna
37bb0 70 73 68 6f 74 5f 6f 70 65 6e 22 2c 20 74 65 73  pshot_open", tes
37bc0 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 2c  t_snapshot_open,
37bd0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
37be0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
37bf0 72 65 65 22 2c 20 74 65 73 74 5f 73 6e 61 70 73  ree", test_snaps
37c00 68 6f 74 5f 66 72 65 65 2c 20 30 20 7d 2c 0a 20  hot_free, 0 },. 
37c10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
37c20 6e 61 70 73 68 6f 74 5f 63 6d 70 22 2c 20 74 65  napshot_cmp", te
37c30 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 2c  st_snapshot_cmp,
37c40 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
37c50 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
37c60 65 63 6f 76 65 72 22 2c 20 74 65 73 74 5f 73 6e  ecover", test_sn
37c70 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 2c 20  apshot_recover, 
37c80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37c90 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
37ca0 74 5f 62 6c 6f 62 22 2c 20 74 65 73 74 5f 73 6e  t_blob", test_sn
37cb0 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 2c  apshot_get_blob,
37cc0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
37cd0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
37ce0 70 65 6e 5f 62 6c 6f 62 22 2c 20 74 65 73 74 5f  pen_blob", test_
37cf0 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c  snapshot_open_bl
37d00 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
37d10 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  "sqlite3_snapsho
37d20 74 5f 63 6d 70 5f 62 6c 6f 62 22 2c 20 74 65 73  t_cmp_blob", tes
37d30 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 62  t_snapshot_cmp_b
37d40 6c 6f 62 2c 20 30 20 7d 2c 0a 23 65 6e 64 69 66  lob, 0 },.#endif
37d50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37d60 5f 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65  _delete_database
37d70 22 2c 20 74 65 73 74 5f 64 65 6c 65 74 65 5f 64  ", test_delete_d
37d80 61 74 61 62 61 73 65 2c 20 20 20 20 30 20 7d 2c  atabase,    0 },
37d90 0a 20 20 20 20 20 7b 20 22 61 74 6f 6d 69 63 5f  .     { "atomic_
37da0 62 61 74 63 68 5f 77 72 69 74 65 22 2c 20 20 20  batch_write",   
37db0 20 20 20 74 65 73 74 5f 61 74 6f 6d 69 63 5f 62     test_atomic_b
37dc0 61 74 63 68 5f 77 72 69 74 65 2c 20 30 20 7d 2c  atch_write, 0 },
37dd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37de0 5f 6d 6d 61 70 5f 77 61 72 6d 22 2c 20 20 20 20  _mmap_warm",    
37df0 20 20 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72     test_mmap_war
37e00 6d 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  m,          0 },
37e10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37e20 5f 63 6f 6e 66 69 67 5f 73 6f 72 74 65 72 72 65  _config_sorterre
37e30 66 22 2c 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f  f", test_config_
37e40 73 6f 72 74 65 72 72 65 66 2c 20 20 20 30 20 7d  sorterref,   0 }
37e50 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
37e60 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65  int bitmask_size
37e70 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
37e80 6b 29 2a 38 3b 0a 20 20 73 74 61 74 69 63 20 69  k)*8;.  static i
37e90 6e 74 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69  nt longdouble_si
37ea0 7a 65 20 3d 20 73 69 7a 65 6f 66 28 4c 4f 4e 47  ze = sizeof(LONG
37eb0 44 4f 55 42 4c 45 5f 54 59 50 45 29 3b 0a 20 20  DOUBLE_TYPE);.  
37ec0 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
37ed0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
37ee0 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f  _count, sqlite3_
37ef0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a  fullsync_count;.
37f00 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
37f10 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
37f20 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
37f30 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
37f40 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
37f50 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
37f60 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
37f70 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
37f80 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
37f90 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
37fa0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
37fb0 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
37fc0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
37fd0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37fe0 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45  ount;.#if SQLITE
37ff0 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e  _OS_WIN.  extern
38000 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73   LONG volatile s
38010 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a  qlite3_os_type;.
38020 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
38030 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74  LITE_DEBUG.  ext
38040 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
38050 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74  hereTrace;.  ext
38060 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  ern int sqlite3O
38070 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e  STrace;.  extern
38080 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54   int sqlite3WalT
38090 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
380a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
380b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
380c0 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65  ABLE_FTS3.  exte
380d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
380e0 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
380f0 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23  theses;.#endif.#
38100 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30  endif..  for(i=0
38110 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29  ; i<sizeof(aCmd)
38120 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29  /sizeof(aCmd[0])
38130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
38140 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
38150 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e  terp, aCmd[i].zN
38160 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72  ame, aCmd[i].xPr
38170 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
38180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
38190 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
381a0 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
381b0 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
381c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
381d0 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
381e0 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
381f0 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
38200 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
38210 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
38220 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
38230 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
38240 5f 73 65 61 72