/ Hex Artifact Content
Login

Artifact 84f9472ca24c2c2aa2d76256f19db3ce0bb0224c0553db793f0fb2c0969c869e:


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 76  ../*.** Usage: v
ff00: 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f  fs_current_time_
ff10: 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74 75  int64.**.** Retu
ff20: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  rn the value ret
ff30: 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65 66  urned by the def
ff40: 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72 72  ault VFS's xCurr
ff50: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65 74  entTimeInt64 met
ff60: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
ff70: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ff80: 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49   vfsCurrentTimeI
ff90: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
ffa0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ffb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ffc0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ffd0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ffe0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74 3b  jv[].){.  i64 t;
fff0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10000 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
10010 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
10020 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
10030 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10040 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10050 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
10060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10070 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65  }.  pVfs->xCurre
10080 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
10090 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , &t);.  Tcl_Set
100a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
100b0 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
100c0 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75 72  Obj(t));.  retur
100d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
100e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
100f0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10100 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10110 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42 20  snapshot_get DB 
10120 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  DBNAME.*/.static
10130 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
10140 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
10150 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _get(.  void * c
10160 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10180 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10190 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
101a0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
101b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
101c0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
101d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
101e0 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20  ot *pSnapshot = 
101f0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
10200 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
10210 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10220 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
10230 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    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 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
10260 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10280 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
102a0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
102b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
102c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
102d0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62  _snapshot_get(db
102e0 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73  , zName, &pSnaps
102f0 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  hot);.  if( rc!=
10300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10310 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10320 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10330 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
10340 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
10350 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
10360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
10370 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
10380 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20  f[100];.    if( 
10390 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
103a0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
103b0 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f  , zBuf, pSnapsho
103c0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
103d0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53  ERROR;.    Tcl_S
103e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
103f0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
10400 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b  gObj(zBuf, -1));
10410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10420 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
10430 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10440 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
10450 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10460 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10470 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10480 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72  snapshot_recover
10490 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74   DB DBNAME.*/.st
104a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
104b0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
104c0 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20 20  shot_recover(.  
104d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
104e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
104f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10500 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10510 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10520 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10530 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10540 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f  *zName;..  if( o
10550 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
10560 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10570 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10580 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20  "DB DBNAME");.  
10590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
105a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
105b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
105c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
105d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
105e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
105f0 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63  OR;.  zName = Tc
10600 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10610 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [2]);..  rc = sq
10620 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
10630 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d 65  ecover(db, zName
10640 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10660 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10670 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10680 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
10690 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
106a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
106b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
106c0 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
106d0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
106e0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
106f0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10710 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10730 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
10740 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
10750 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44 42  pshot_open DB DB
10760 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f  NAME SNAPSHOT.*/
10770 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10780 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
10790 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
107a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
107b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
107c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
107d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
107e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
107f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10800 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10810 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
10820 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
10830 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pshot;..  if( ob
10840 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
10850 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10860 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10870 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48  DB DBNAME SNAPSH
10880 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OT");.    return
10890 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
108a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
108b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
108c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
108d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
108e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e   TCL_ERROR;.  zN
108f0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
10900 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
10910 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c  pSnapshot = (sql
10920 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73  ite3_snapshot*)s
10930 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
10940 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  Ptr(Tcl_GetStrin
10950 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20  g(objv[3]));..  
10960 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
10970 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a  pshot_open(db, z
10980 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74 29  Name, pSnapshot)
10990 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
109a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
109b0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
109c0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
109d0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
109e0 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
109f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10a00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10a10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
10a20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10a30 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
10a40 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10a50 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10a60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10a70 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
10a80 72 65 65 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a  ree SNAPSHOT.*/.
10a90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10aa0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10ab0 61 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76  apshot_free(.  v
10ac0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10ad0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10ae0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10af0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10b00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10b10 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10b20 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20  t *pSnapshot;.  
10b30 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10b40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10b50 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10b60 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29  bjv, "SNAPSHOT")
10b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10b80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53  _ERROR;.  }.  pS
10b90 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74  napshot = (sqlit
10ba0 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c  e3_snapshot*)sql
10bb0 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
10bc0 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
10bd0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c  objv[1]));.  sql
10be0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
10bf0 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ee(pSnapshot);. 
10c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10c10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10c20 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10c30 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
10c40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
10c50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SHOT./*.** Usage
10c60 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
10c70 6f 74 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31  ot_cmp SNAPSHOT1
10c80 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74   SNAPSHOT2.*/.st
10c90 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
10ca0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
10cb0 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64  shot_cmp(.  void
10cc0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10cd0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10ce0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10cf0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10d00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10d10 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  t res;.  sqlite3
10d20 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20  _snapshot *p1;. 
10d30 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10d40 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a  t *p2;.  if( obj
10d50 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10d60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10d70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
10d80 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
10d90 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T2");.    return
10da0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10db0 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f    p1 = (sqlite3_
10dc0 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65  snapshot*)sqlite
10dd0 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54  3TestTextToPtr(T
10de0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10df0 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28  v[1]));.  p2 = (
10e00 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10e10 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10e20 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10e30 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
10e40 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
10e50 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c  snapshot_cmp(p1,
10e60 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   p2);.  Tcl_SetO
10e70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10e80 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
10e90 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  es));.  return T
10ea0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10eb0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10ec0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10ee0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10ef0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10f00 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c  _snapshot_get_bl
10f10 6f 62 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a  ob DB DBNAME.*/.
10f20 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10f30 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10f40 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 28  apshot_get_blob(
10f50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10f60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10f70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10f80 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10f90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10fa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10fb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
10fc0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
10fd0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
10fe0 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20  Snapshot = 0;.. 
10ff0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
11000 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11020 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
11030 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
11040 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11050 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
11060 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11070 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11080 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
11090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d  CL_ERROR;.  zNam
110a0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
110b0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72  g(objv[2]);..  r
110c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  c = sqlite3_snap
110d0 73 68 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61  shot_get(db, zNa
110e0 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f 74 29 3b  me, &pSnapshot);
110f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
11110 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11120 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11130 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
11140 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
11150 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11160 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
11170 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11180 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
11190 20 20 20 20 20 54 63 6c 5f 4e 65 77 42 79 74 65       Tcl_NewByte
111a0 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e  ArrayObj((unsign
111b0 65 64 20 63 68 61 72 2a 29 70 53 6e 61 70 73 68  ed char*)pSnapsh
111c0 6f 74 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ot, sizeof(sqlit
111d0 65 33 5f 73 6e 61 70 73 68 6f 74 29 29 0a 20 20  e3_snapshot)).  
111e0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
111f0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 70  _snapshot_free(p
11200 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 7d 0a 20  Snapshot);.  }. 
11210 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11220 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11230 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
11240 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
11250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
11260 53 48 4f 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  SHOT.  /*.  ** U
11270 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11280 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62  apshot_open_blob
11290 20 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53   DB DBNAME SNAPS
112a0 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
112b0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
112c0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  test_snapshot_op
112d0 65 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  en_blob(.  void 
112e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
112f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11300 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11310 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11320 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
11330 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
11340 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  db;.  char *zNam
11350 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
11360 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ar *pBlob;.  int
11370 20 6e 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f   nBlob;..  if( o
11380 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
11390 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
113a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
113b0 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
113c0 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
113d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
113e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
113f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11400 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11410 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
11430 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
11440 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
11450 20 70 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65 74   pBlob = Tcl_Get
11460 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
11470 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 6c 6f 62  (objv[3], &nBlob
11480 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 21 3d  );.  if( nBlob!=
11490 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73  sizeof(sqlite3_s
114a0 6e 61 70 73 68 6f 74 29 20 29 7b 0a 20 20 20 20  napshot) ){.    
114b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
114c0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e  (interp, "bad SN
114d0 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20  APSHOT", 0);.   
114e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
114f0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
11500 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
11510 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  pen(db, zName, (
11520 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11530 2a 29 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  *)pBlob);.  if( 
11540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11550 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
11560 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
11570 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
11580 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
11590 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ), -1));.    ret
115a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
115b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
115c0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
115d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
115e0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
115f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11600 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
11610 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11620 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 20  apshot_cmp_blob 
11630 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48  SNAPSHOT1 SNAPSH
11640 4f 54 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OT2.*/.static in
11650 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
11660 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  test_snapshot_cm
11670 70 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  p_blob(.  void *
11680 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11690 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
116a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
116b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
116c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
116d0 72 65 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  res;.  unsigned 
116e0 63 68 61 72 20 2a 70 31 3b 0a 20 20 75 6e 73 69  char *p1;.  unsi
116f0 67 6e 65 64 20 63 68 61 72 20 2a 70 32 3b 0a 20  gned char *p2;. 
11700 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 6e   int n1;.  int n
11710 32 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  2;..  if( objc!=
11720 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
11730 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11740 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50  , 1, objv, "SNAP
11750 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 22  SHOT1 SNAPSHOT2"
11760 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11770 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11780 70 31 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  p1 = Tcl_GetByte
11790 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
117a0 76 5b 31 5d 2c 20 26 6e 31 29 3b 0a 20 20 70 32  v[1], &n1);.  p2
117b0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
117c0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
117d0 32 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 69 66 28  2], &n2);..  if(
117e0 20 6e 31 21 3d 73 69 7a 65 6f 66 28 73 71 6c 69   n1!=sizeof(sqli
117f0 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 7c 7c  te3_snapshot) ||
11800 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 54   n1!=n2 ){.    T
11810 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11820 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e 41  interp, "bad SNA
11830 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20  PSHOT", 0);.    
11840 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11850 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 20 3d 20 73  ;.  }..  res = s
11860 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
11870 63 6d 70 28 28 73 71 6c 69 74 65 33 5f 73 6e 61  cmp((sqlite3_sna
11880 70 73 68 6f 74 2a 29 70 31 2c 20 28 73 71 6c 69  pshot*)p1, (sqli
11890 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 32  te3_snapshot*)p2
118a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
118b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
118c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 29  l_NewIntObj(res)
118d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
118e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
118f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
11900 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  APSHOT */../*.**
11910 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
11920 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 20  delete_database 
11930 46 49 4c 45 4e 41 4d 45 0a 2a 2f 0a 69 6e 74 20  FILENAME.*/.int 
11940 73 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64  sqlite3_delete_d
11950 61 74 61 62 61 73 65 28 63 6f 6e 73 74 20 63 68  atabase(const ch
11960 61 72 2a 29 3b 20 20 20 2f 2a 20 69 6e 20 74 65  ar*);   /* in te
11970 73 74 5f 64 65 6c 65 74 65 2e 63 20 2a 2f 0a 73  st_delete.c */.s
11980 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
11990 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 65 6c  _TCLAPI test_del
119a0 65 74 65 5f 64 61 74 61 62 61 73 65 28 0a 20 20  ete_database(.  
119b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
119c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
119d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
119e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
119f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11a00 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
11a10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
11a20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
11a30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11a40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11a50 6f 62 6a 76 2c 20 22 46 49 4c 45 22 29 3b 0a 20  objv, "FILE");. 
11a60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11a70 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  ROR;.  }.  zFile
11a80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
11a90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11aa0 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73  jv[1]);.  rc = s
11ab0 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
11ac0 74 61 62 61 73 65 28 7a 46 69 6c 65 29 3b 0a 0a  tabase(zFile);..
11ad0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11ae0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11af0 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
11b00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
11b10 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
11b20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11b30 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
11b40 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20 53  next_stmt  DB  S
11b50 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
11b60 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d 65   the next statme
11b70 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20 61  nt in sequence a
11b80 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  fter STMT..*/.st
11b90 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11ba0 54 43 4c 41 50 49 20 74 65 73 74 5f 6e 65 78 74  TCLAPI test_next
11bb0 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20  _stmt(.  void * 
11bc0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11bd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11be0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11bf0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11c00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
11c10 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11c20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11c30 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
11c40 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
11c50 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
11c60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11c70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11c80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11c90 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
11ca0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11cb0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
11cc0 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
11cd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
11cf0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
11d00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11d10 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
11d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11d30 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ;.  if( getStmtP
11d40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11d50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11d60 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[2]), &pStmt) )
11d70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11d80 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c  R;.  pStmt = sql
11d90 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64  ite3_next_stmt(d
11da0 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  b, pStmt);.  if(
11db0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
11dc0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
11dd0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
11de0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
11df0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11e00 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
11e10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11e20 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
11e30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
11e50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72    sqlite3_stmt_r
11e60 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a  eadonly  STMT.**
11e70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
11e80 69 66 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c  if STMT is a NUL
11e90 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70  L pointer or a p
11ea0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
11eb0 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73  ement.** that is
11ec0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
11ed0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
11ee0 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  e unmodified..*/
11ef0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
11f00 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
11f10 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
11f20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11f30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11f40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11f50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11f60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11f70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11f80 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
11f90 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
11fa0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11fb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11fc0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11fd0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
11fe0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
11ff0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12000 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
12010 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12020 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12030 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12040 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12050 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12060 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12070 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12080 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12090 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
120a0 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
120b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
120c0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
120d0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
120e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
120f0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
12100 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
12110 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
12120 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
12130 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
12140 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
12150 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
12160 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
12170 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
12180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12190 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
121a0 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a 20 20  st_stmt_busy(.  
121b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
121c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
121d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
121e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
121f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12200 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12210 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
12220 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
12230 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12240 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12250 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
12260 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
12270 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
12280 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12290 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
122a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
122b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
122c0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
122d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
122e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
122f0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12310 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12320 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d 74 29  stmt_busy(pStmt)
12330 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
12340 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12350 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
12360 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
12370 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12380 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
12390 74 6d 74 5f 72 65 66 72 65 73 68 20 20 53 54 4d  tmt_refresh  STM
123a0 54 0a 2a 2a 0a 2a 2a 20 52 65 63 6f 6d 70 69 6c  T.**.** Recompil
123b0 65 20 74 68 65 20 53 54 4d 54 20 70 72 65 70 61  e the STMT prepa
123c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 66  red statement if
123d0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
123e0 72 65 63 6f 6d 70 69 6c 65 64 2e 0a 2a 2f 0a 73  recompiled..*/.s
123f0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
12400 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
12410 74 5f 72 65 66 72 65 73 68 28 0a 20 20 76 6f 69  t_refresh(.  voi
12420 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12430 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12440 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
12450 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
12460 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
12470 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
12480 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
12490 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
124a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
124b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
124c0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
124d0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
124e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
124f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
12500 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29   0), " STMT", 0)
12510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12520 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
12530 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
12540 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
12550 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12560 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
12570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12580 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  rc = sqlite3_stm
12590 74 5f 72 65 66 72 65 73 68 28 70 53 74 6d 74 29  t_refresh(pStmt)
125a0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
125b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
125c0 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
125d0 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
125e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
125f0 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74 6d 74  sage:  uses_stmt
12600 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54 0a 2a  _journal  STMT.*
12610 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
12620 20 69 66 20 53 54 4d 54 20 75 73 65 73 20 61 20   if STMT uses a 
12630 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
12640 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
12650 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 75   SQLITE_TCLAPI u
12660 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
12670 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12680 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12690 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
126a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
126b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
126c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
126d0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
126e0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
126f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12700 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
12710 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12720 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12730 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12740 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12750 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
12760 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12770 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
12780 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
12790 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
127a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
127b0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
127c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
127d0 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
127e0 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
127f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12800 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
12810 6c 65 61 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a  leanObj(((Vdbe *
12820 29 70 53 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d  )pStmt)->usesStm
12830 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65  tJournal));.  re
12840 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12850 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
12860 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54  qlite3_reset  ST
12870 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20  MT .**.** Reset 
12880 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
12890 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
128a0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
128b0 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
128c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
128d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
128e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
128f0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
12900 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
12910 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12920 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
12930 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
12940 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12950 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12960 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12970 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
12980 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
12990 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
129a0 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
129b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
129c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
129d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
129e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
129f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12a00 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12a20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
12a30 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
12a40 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
12a50 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
12a60 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
12a70 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
12a80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12a90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
12aa0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12ab0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
12ac0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
12ad0 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
12ae0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
12af0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12b00 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
12b10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12b20 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
12b30 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
12b40 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
12b50 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
12b60 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
12b70 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
12b80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12b90 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
12ba0 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76  est_expired(.  v
12bb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12bc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12bd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12be0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12bf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
12c00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12c10 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
12c20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12c30 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  tmt;.  if( objc!
12c40 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
12c50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12c60 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12c70 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12c80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
12c90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12ca0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
12cb0 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
12cc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12cd0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
12ce0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12cf0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12d00 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
12d10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12d20 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
12d30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12d40 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
12d50 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  j(sqlite3_expire
12d60 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64  d(pStmt)));.#end
12d70 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
12d80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
12d90 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61  ge:  sqlite3_tra
12da0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46  nsfer_bindings F
12db0 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a  ROMSTMT TOSTMT.*
12dc0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c  *.** Transfer al
12dd0 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20  l bindings from 
12de0 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f  FROMSTMT over to
12df0 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69   TOSTMT.*/.stati
12e00 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
12e10 41 50 49 20 74 65 73 74 5f 74 72 61 6e 73 66 65  API test_transfe
12e20 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  r_bind(.  void *
12e30 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12e40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12e50 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12e60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12e70 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
12e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
12e90 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74  PRECATED.  sqlit
12ea0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c  e3_stmt *pStmt1,
12eb0 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20   *pStmt2;.  if( 
12ec0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
12ed0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12ee0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
12ef0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12f00 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12f10 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12f20 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12f30 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53  " FROM-STMT TO-S
12f40 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
12f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12f60 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
12f70 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12f80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12f90 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31  bjv[1]), &pStmt1
12fa0 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
12fb0 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
12fc0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
12fd0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12fe0 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
12ff0 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  2)) return TCL_E
13000 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
13010 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13020 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
13030 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61  tObj(sqlite3_tra
13040 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70  nsfer_bindings(p
13050 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b  Stmt1,pStmt2)));
13060 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
13070 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
13080 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
13090 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
130a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
130b0 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
130c0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
130d0 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
130e0 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
130f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
13100 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
13110 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
13120 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
13130 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
13140 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
13150 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
13160 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
13170 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13180 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
13190 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
131a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
131b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
131c0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
131d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
131e0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
131f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
13200 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
13210 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
13220 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13230 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13240 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
13250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
13260 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13270 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
13280 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
13290 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
132a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
132b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
132c0 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
132d0 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
132e0 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
132f0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
13300 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
13310 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
13320 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
13330 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
13340 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
13350 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
13360 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
13370 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
13380 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
13390 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
133a0 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
133b0 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
133c0 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
133d0 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 22   occurrence of "
133e0 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ?" in the origin
133f0 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67  al SQL.** string
13400 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20  .  VALUE is the 
13410 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46  new value.  If F
13420 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65  LAGS=="null" the
13430 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67  n VALUE is.** ig
13440 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61  nored and the va
13450 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
13460 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  LL.  If FLAGS=="
13470 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20  static" then.** 
13480 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
13490 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
134a0 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62   a static variab
134b0 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c  le named.** "sql
134c0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
134d0 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47  value".  If FLAG
134e0 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e  S=="normal" then
134f0 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
13500 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e  e VALUE is made.
13510 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f    If FLAGS=="blo
13520 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55  b10" then a VALU
13530 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  E is ignored.** 
13540 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f  an a 10-byte blo
13550 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30  b "abc\000xyz\00
13560 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64  0pq" is inserted
13570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13580 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
13590 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  st_bind(.  void 
135a0 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
135b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
135c0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
135d0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
135e0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
135f0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
13600 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
13610 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
13620 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
13630 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
13640 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
13650 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
13660 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
13670 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
13680 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
13690 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
136a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
136b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
136c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
136d0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
136e0 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20  ], .       " VM 
136f0 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c  IDX VALUE (null|
13700 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22  static|normal)\"
13710 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
13720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13730 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
13740 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
13750 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29  gv[1], &pStmt) )
13760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13770 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
13780 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
13790 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
137a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
137b0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
137c0 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  [4],"null")==0 )
137d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
137e0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
137f0 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73  mt, idx);.  }els
13800 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
13810 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d  v[4],"static")==
13820 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
13830 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
13840 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
13850 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
13860 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  alue, -1, 0);.  
13870 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13880 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
13890 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  -nbytes")==0 ){.
138a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
138b0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
138c0 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74  , idx, sqlite_st
138d0 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
138e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73          sqlite_s
13910 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
13920 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
13930 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
13940 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b  ,"normal")==0 ){
13950 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13960 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
13970 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c  t, idx, argv[3],
13980 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
13990 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20  SIENT);.  }else 
139a0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
139b0 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20  4],"blob10")==0 
139c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
139d0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
139e0 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30  tmt, idx, "abc\0
139f0 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30  00xyz\000pq", 10
13a00 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
13a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
13a20 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13a30 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72 67  interp, "4th arg
13a40 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
13a50 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c  ".        "\"nul
13a60 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c  l\" or \"static\
13a70 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22  " or \"normal\""
13a80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13a90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13aa0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13ab0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13ac0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
13ad0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13ae0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13af0 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  rc ){.    char z
13b00 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
13b10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
13b20 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
13b30 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
13b40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13b50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
13b60 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
13b70 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
13b80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13b90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
13ba0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
13bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13bc0 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
13bd0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
13be0 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
13bf0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
13c00 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
13c10 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13c20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
13c30 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
13c40 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
13c50 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
13c60 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
13c70 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
13c80 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
13c90 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
13ca0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
13cb0 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
13cc0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
13cd0 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
13ce0 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
13cf0 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
13d00 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
13d10 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
13d20 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
13d30 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
13d40 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
13d50 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
13d60 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
13d70 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
13d80 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
13d90 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
13da0 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
13db0 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
13dc0 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
13dd0 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
13de0 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
13df0 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
13e00 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
13e10 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
13e20 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
13e30 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
13e40 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
13e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
13e60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
13e70 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
13e80 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
13e90 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
13ea0 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
13eb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
13ec0 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
13ed0 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
13ee0 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
13ef0 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
13f00 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
13f10 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
13f20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
13f30 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
13f40 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
13f50 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
13f60 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
13f70 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
13f80 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
13f90 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
13fa0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
13fb0 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
13fc0 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
13fd0 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
13fe0 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
13ff0 6f 6e 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  one interpreter 
14000 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68  at a time, as th
14010 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e  e.** interp poin
14020 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ter to use when 
14030 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54  evaluating the T
14040 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f  CL script is sto
14050 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43  red in.** pTestC
14060 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f  ollateInterp..*/
14070 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65  .static Tcl_Inte
14080 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  rp* pTestCollate
14090 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69  Interp;.static i
140a0 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
140b0 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
140c0 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
140d0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
140e0 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
140f0 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c  oid *zB.){.  Tcl
14100 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65  _Interp *i = pTe
14110 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
14120 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53  .  int encin = S
14130 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
14140 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65  (pCtx);.  int re
14150 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73  s;.  int n;..  s
14160 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14170 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  al;.  Tcl_Obj *p
14180 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  X;..  pX = Tcl_N
14190 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
141a0 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b  t_collate", -1);
141b0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
141c0 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74  unt(pX);..  swit
141d0 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20  ch( encin ){.   
141e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
141f0 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  8:.      Tcl_Lis
14200 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14210 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
14220 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
14230 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
14240 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
14250 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20  TE_UTF16LE:.    
14260 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14270 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
14280 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14290 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29  ("UTF-16LE",-1))
142a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
142b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
142c0 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63  TF16BE:.      Tc
142d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
142e0 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
142f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14300 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16BE",-1));.  
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
14320 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
14330 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
14340 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14350 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56  gnMalloc();.  pV
14360 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
14370 65 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70  eNew(0);.  if( p
14380 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
14390 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
143a0 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69  al, nA, zA, enci
143b0 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
143c0 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  );.    n = sqlit
143d0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
143e0 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Val);.    Tcl_Li
143f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14400 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20  nt(i,pX,.       
14410 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14420 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
14430 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
14440 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ),n));.    sqlit
14450 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
14460 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69  al, nB, zB, enci
14470 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
14480 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  );.    n = sqlit
14490 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
144a0 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Val);.    Tcl_Li
144b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
144c0 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20  nt(i,pX,.       
144d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
144e0 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
144f0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
14500 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ),n));.    sqlit
14510 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
14520 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14530 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14540 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  );..  Tcl_EvalOb
14550 6a 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20  jEx(i, pX, 0);. 
14560 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14570 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74  t(pX);.  Tcl_Get
14580 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63  IntFromObj(i, Tc
14590 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
145a0 29 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75  ), &res);.  retu
145b0 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63  rn res;.}.static
145c0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
145d0 50 49 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  PI test_collate(
145e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
145f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
14600 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
14610 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
14620 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
14630 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14640 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
14650 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14660 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
14670 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
14680 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
14690 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
146a0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69  rp = interp;.  i
146b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
146c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
146d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
146e0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
146f0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
14700 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
14710 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
14720 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
14730 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
14740 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
14750 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
14760 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
14770 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
14780 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
14790 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
147a0 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
147b0 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
147c0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
147d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
147e0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31  onst void *zUtf1
147f0 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  6;.    if( TCL_O
14800 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
14810 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
14820 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
14830 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14840 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  OR;.    rc = sql
14850 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
14860 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
14870 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
14880 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
14890 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
148a0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
148b0 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
148c0 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28  func:0);.    if(
148d0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
148e0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
148f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
14900 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
14910 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30  CL_ERROR;..#if 0
14920 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14930 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
14940 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14950 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
14960 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14970 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14980 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
14990 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
149a0 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
149b0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
149c0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
149d0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
149e0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
149f0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14a00 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
14a10 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
14a20 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
14a30 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
14a40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14a50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14a60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
14a80 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14a90 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
14aa0 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f   zUtf16, SQLITE_
14ab0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
14ac0 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
14ad0 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
14ae0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
14af0 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  c:0);.    }.    
14b00 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14b10 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
14b20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14b30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
14b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
14b50 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
14b60 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
14b70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
14b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
14ba0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14bb0 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
14bc0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
14bd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14be0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
14bf0 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
14c00 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
14c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
14c20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
14c30 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
14c40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
14c50 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
14c60 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
14c70 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
14c80 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74  6be>", 0);.  ret
14c90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
14ca0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
14cb0 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
14cc0 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
14cd0 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74  >.**.** Add a ut
14ce0 66 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  f-16 collation s
14cf0 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75  equence named "u
14d00 74 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20  tf16bin" to the 
14d10 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
14d20 6c 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  le. This collati
14d30 6f 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70  on sequence comp
14d40 61 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69  ares arguments i
14d50 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
14d60 73 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69  s the.** built-i
14d70 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e  n collation "bin
14d80 61 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ary"..*/.static 
14d90 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69  int test_utf16bi
14da0 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  n_collate_func(.
14db0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
14dc0 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
14dd0 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
14de0 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
14df0 42 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  B.){.  int nCmp 
14e00 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20  = (nA>nB ? nB : 
14e10 6e 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  nA);.  int res =
14e20 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20   memcmp(zA, zB, 
14e30 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
14e40 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d  ==0 ) res = nA -
14e50 20 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65   nB;.  return re
14e60 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
14e70 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
14e80 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
14e90 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
14ea0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14eb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14ec0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14ed0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14ee0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14ef0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
14f00 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
14f10 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
14f20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
14f30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
14f40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
14f50 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
14f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
14f70 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
14f80 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
14f90 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c   "utf16bin", SQL
14fa0 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20  ITE_UTF16, 0, . 
14fb0 20 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62       test_utf16b
14fc0 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a  in_collate_func.
14fd0 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74    );.  if( sqlit
14fe0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
14ff0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
15000 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15010 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
15020 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
15030 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15040 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
15050 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
15060 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
15070 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  /*.** When the c
15080 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
15090 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
150a0 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ked, record the 
150b0 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  name of .** the 
150c0 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
150d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  ing function her
150e0 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64  e.  The recorded
150f0 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a   name is linked.
15100 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69  ** to a TCL vari
15110 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f  able and used to
15120 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
15130 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
15140 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20  llation.** name 
15150 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  is correct..*/.s
15160 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64  tatic char zNeed
15170 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d  edCollation[200]
15180 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  ;.static char *p
15190 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
151a0 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   = zNeededCollat
151b0 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ion;.../*.** Cal
151c0 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61  led when a colla
151d0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
151e0 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74   needed.  Regist
151f0 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ered using.** sq
15200 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
15210 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73  needed16()..*/.s
15220 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
15230 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
15240 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
15250 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
15260 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
15270 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15280 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Name.){.  int en
15290 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69  c = ENC(db);.  i
152a0 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
152b0 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72  .  for(z = (char
152c0 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a  *)pName, i=0; *z
152d0 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a   || z[1]; z++){.
152e0 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65      if( *z ) zNe
152f0 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b  ededCollation[i+
15300 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a  +] = *z;.  }.  z
15310 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
15320 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
15330 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
15340 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74  on(.      db, "t
15350 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e  est_collate", EN
15360 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e  C(db), SQLITE_IN
15370 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74  T_TO_PTR(enc), t
15380 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
15390 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
153a0 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
153b0 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
153c0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
153d0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
153e0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20  ollate_needed(. 
153f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15400 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15410 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15420 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15430 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15440 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15450 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15460 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
15470 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
15480 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
15490 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
154a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
154b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
154c0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
154d0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
154e0 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74  eeded16(db, 0, t
154f0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
15500 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65  ed_cb);.  zNeede
15510 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20  dCollation[0] = 
15520 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
15530 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15540 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
15550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15570 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
15580 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15590 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
155a0 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  "DB");.  return 
155b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
155c0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64  .** tclcmd:   ad
155d0 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
155e0 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a  _collations  DB.
155f0 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65  **.** Add two ne
15600 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  w collating sequ
15610 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74  ences to the dat
15620 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20  abase DB.**.**  
15630 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64     utf16_aligned
15640 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e  .**     utf16_un
15650 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f  aligned.**.** Bo
15660 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  th collating seq
15670 75 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73  uences use the s
15680 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61  ame sort order a
15690 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65  s BINARY..** The
156a0 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
156b0 20 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66   is that the utf
156c0 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61  16_aligned colla
156d0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
156e0 20 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74   is declared wit
156f0 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46  h the SQLITE_UTF
15700 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e  16_ALIGNED flag.
15710 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69  .** Both collati
15720 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63  ng functions inc
15730 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69  rement the unali
15740 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74  gned utf16 count
15750 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74  er.** whenever t
15760 68 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67  hey see a string
15770 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20   that begins on 
15780 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e  an odd byte boun
15790 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dary..*/.static 
157a0 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  int unaligned_st
157b0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30  ring_counter = 0
157c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69  ;.static int ali
157d0 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a  gnmentCollFunc(.
157e0 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
157f0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
15800 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
15810 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
15820 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
15830 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
15840 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
15850 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
15860 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30  2;.  if( nKey1>0
15870 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54   && 1==(1&(SQLIT
15880 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65  E_PTR_TO_INT(pKe
15890 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65  y1))) ) unaligne
158a0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
158b0 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e  ++;.  if( nKey2>
158c0 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49  0 && 1==(1&(SQLI
158d0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b  TE_PTR_TO_INT(pK
158e0 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67 6e  ey2))) ) unalign
158f0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
15900 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  r++;.  rc = memc
15910 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
15920 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
15930 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
15940 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
15950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
15960 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
15970 5f 54 43 4c 41 50 49 20 61 64 64 5f 61 6c 69 67  _TCLAPI add_alig
15980 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
15990 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20  tions(.  void * 
159a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
159b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
159c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
159d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
159e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
159f0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
15a00 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc>=2 ){.    if(
15a10 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15a20 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15a30 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15a40 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15a50 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
15a60 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
15a70 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75  ion(db, "utf16_u
15a80 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54  naligned", SQLIT
15a90 45 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20  E_UTF16, .      
15aa0 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f    0, alignmentCo
15ab0 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c  llFunc);.    sql
15ac0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
15ad0 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36  ation(db, "utf16
15ae0 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54  _aligned", SQLIT
15af0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c  E_UTF16_ALIGNED,
15b00 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
15b10 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
15b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15b30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
15b40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
15b50 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
15b60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   */../*.** Usage
15b70 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74  : add_test_funct
15b80 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ion <db ptr> <ut
15b90 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
15ba0 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
15bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
15bc0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
15bd0 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
15be0 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72  the correct user
15bf0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  .** function cal
15c00 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
15c10 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
15c20 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
15c30 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
15c40 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
15c50 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
15c60 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
15c70 72 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76  rs up to three v
15c80 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75  ersions of the u
15c90 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
15ca0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20  "test_function" 
15cb0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
15cc0 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74  ndle <db>.  If t
15cd0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15ce0 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  nt is.** true, t
15cf0 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  hen a version of
15d00 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69   test_function i
15d10 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
15d20 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a   UTF-8, if the.*
15d30 2a 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  * third is true,
15d40 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65   a version is re
15d50 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
15d60 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f  -16le, if the fo
15d70 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c  urth is.** true,
15d80 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
15d90 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
15da0 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  .  Previous vers
15db0 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f  ions of.** test_
15dc0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c  function are del
15dd0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
15de0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  user function is
15df0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
15e00 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c  calling the foll
15e10 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
15e20 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
15e30 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c  function <enc> <
15e40 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72  arg>".**.** Wher
15e50 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f  e <enc> is one o
15e60 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c  f UTF-8, UTF-16L
15e70 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e  E or UTF16BE, an
15e80 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a  d <arg> is the.*
15e90 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
15ea0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
15eb0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
15ec0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
15ed0 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73   by.** the TCL s
15ee0 63 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73  cript is used as
15ef0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15f00 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  e of the SQL fun
15f10 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20  ction. It.** is 
15f20 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65  passed to SQLite
15f30 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20   using UTF-16BE 
15f40 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74  for a UTF-8 test
15f50 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46  _function(), UTF
15f60 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d  -8.** for a UTF-
15f70 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69  16LE test_functi
15f80 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36  on(), and UTF-16
15f90 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d  LE for an implem
15fa0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
15fb0 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42   prefers UTF-16B
15fc0 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  E..*/.#ifndef SQ
15fd0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
15fe0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
15ff0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a  _function_utf8(.
16000 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
16010 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
16020 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
16030 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
16040 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16050 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
16060 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
16070 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
16080 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
16090 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
160a0 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
160b0 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
160c0 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
160d0 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
160e0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
160f0 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
16100 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
16110 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
16120 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
16130 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  -8", -1));.  Tcl
16140 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
16150 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
16160 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
16170 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
16180 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
16190 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
161a0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
161b0 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
161c0 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
161d0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71  fCount(pX);.  sq
161e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
161f0 74 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53  t(pCtx, Tcl_GetS
16200 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
16210 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rp), -1, SQLITE_
16220 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56  TRANSIENT);.  pV
16230 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
16240 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
16250 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
16260 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
16270 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
16280 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
16290 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
162a0 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
162b0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
162c0 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  be(pCtx, sqlite3
162d0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28  _value_text16be(
162e0 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
162f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
16300 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
16310 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
16320 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
16330 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
16340 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
16350 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
16360 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
16370 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
16380 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
16390 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
163a0 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
163b0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
163c0 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
163d0 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
163e0 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
163f0 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
16400 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
16410 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
16420 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
16430 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
16440 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
16450 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
16460 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
16470 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b  UTF-16LE", -1));
16480 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
16490 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
164a0 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
164b0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
164c0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
164d0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
164e0 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
164f0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
16500 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
16510 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
16520 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
16530 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
16540 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
16550 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
16560 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
16570 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
16580 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
16590 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
165a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
165b0 74 65 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a  text(pCtx,(char*
165c0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
165d0 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c  ext(pVal),-1,SQL
165e0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
165f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
16600 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
16610 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
16620 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20  ction_utf16be(. 
16630 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
16640 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
16650 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
16660 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
16670 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16680 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
16690 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
166a0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
166b0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
166c0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
166d0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
166e0 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
166f0 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
16700 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
16710 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
16720 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
16730 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
16740 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
16750 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
16760 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16BE", -1));.  T
16770 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
16780 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
16790 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
167a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
167b0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
167c0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
167d0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
167e0 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
167f0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
16800 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
16810 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
16820 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
16830 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
16840 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
16850 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
16860 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
16870 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
16880 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
16890 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
168a0 31 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  16(pCtx, sqlite3
168b0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
168c0 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
168d0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
168e0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  T);.  sqlite3_re
168f0 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43  sult_text16be(pC
16900 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
16910 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29  e_text16le(pVal)
16920 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
16930 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16940 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16950 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73  text16le(pCtx, s
16960 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
16970 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
16980 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
16990 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
169a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
169b0 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
169c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
169d0 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  6 */.static int 
169e0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
169f0 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
16a00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16a10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16a20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16a30 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16a40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16a50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a60 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16a70 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
16a80 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
16a90 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
16aa0 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
16ab0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16ac0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16ad0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
16ae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16af0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
16b00 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16b10 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16b20 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
16b30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16b40 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
16b50 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
16b60 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
16b70 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
16b80 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
16b90 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
16ba0 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
16bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
16bc0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
16bd0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16be0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16bf0 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
16c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16c10 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
16c20 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
16c30 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
16c40 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
16c50 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
16c60 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
16c70 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
16c80 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
16c90 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
16ca0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16cb0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16cc0 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
16cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16ce0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
16cf0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
16d00 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
16d10 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
16d20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
16d30 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
16d40 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
16d50 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
16d60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16d70 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
16d80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16d90 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16da0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16db0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
16dc0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16dd0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
16de0 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
16df0 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
16e00 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
16e10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16e20 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16e30 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
16e40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
16e50 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
16e60 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
16e70 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
16e80 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
16e90 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
16ea0 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
16eb0 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
16ec0 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
16ed0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
16ee0 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
16ef0 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
16f00 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
16f10 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
16f20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
16f30 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
16f40 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
16f50 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
16f60 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
16f70 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
16f80 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
16f90 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16fa0 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 73  TCLAPI test_errs
16fb0 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  tr(.  void * cli
16fc0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16fd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16fe0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16ff0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17000 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  [].){.  char *zC
17010 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ode;.  int i;.  
17020 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
17030 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17040 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
17050 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64  bjv, "<error cod
17060 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f  e>");.  }..  zCo
17070 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  de = Tcl_GetStri
17080 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66  ng(objv[1]);.  f
17090 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69  or(i=0; i<200; i
170a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
170b0 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e 61  strcmp(t1ErrorNa
170c0 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29 20  me(i), zCode) ) 
170d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
170e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
170f0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
17100 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29 3b  e3ErrStr(i), 0);
17110 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17130 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a  :    breakpoint.
17140 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17150 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f 6e  ne exists for on
17160 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20 70  e purpose - to p
17170 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20 74  rovide a place t
17180 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b  o put a.** break
17190 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20 74  point with GDB t
171a0 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67 67  hat can be trigg
171b0 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20 63  ered using TCL c
171c0 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a  ode.  The use.**
171d0 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68 65   for this is whe
171e0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
171f0 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73 61  est fails on (sa
17200 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69 74  y) the 1485th it
17210 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74  eration..** In t
17220 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
17230 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20 63  pt, we can add c
17240 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
17250 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69 3d  *.**     if {$i=
17260 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e  =1485} breakpoin
17270 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e  t.**.** Then run
17280 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e 20   testfixture in 
17290 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e 64  the debugger and
172a0 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62 72   wait for the br
172b0 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66  eakpoint to.** f
172c0 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69 74  ire.  Then addit
172d0 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74  ional breakpoint
172e0 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20  s can be set to 
172f0 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20 62  trace down the b
17300 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
17310 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
17320 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
17330 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
17340 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17350 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
17360 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
17370 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
17380 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
17390 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
173a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
173b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
173c0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
173d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
173e0 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
173f0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ent */.){.  retu
17400 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20  rn TCL_OK;      
17410 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
17420 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   */.}../*.** Usa
17430 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17440 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d  nd_zeroblob  STM
17450 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65  T IDX N.**.** Te
17460 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
17470 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74  ind_zeroblob int
17480 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
17490 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
174a0 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73  ement..** IDX is
174b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
174c0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
174d0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
174e0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
174f0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62  d.** binds a N-b
17500 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  yte zero-filled 
17510 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64  BLOB to the wild
17520 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
17530 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
17540 49 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f  I test_bind_zero
17550 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
17560 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17570 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17580 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17590 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
175a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
175b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
175c0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
175d0 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
175e0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
175f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17600 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
17610 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
17620 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
17630 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17640 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17650 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17660 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17670 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17680 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17690 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
176a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
176b0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
176c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
176d0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
176e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
176f0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
17700 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17710 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17720 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
17730 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29  b(pStmt, idx, n)
17740 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
17750 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
17760 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
17770 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
17780 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
177a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
177b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
177c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
177d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
177e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
177f0 72 6f 62 6c 6f 62 36 34 20 20 53 54 4d 54 20 49  roblob64  STMT I
17800 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
17810 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17820 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 69 6e 74 65  _zeroblob64 inte
17830 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17840 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17850 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20  ment..** IDX is 
17860 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
17870 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
17880 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17890 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
178a0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79  .** binds a N-by
178b0 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42  te zero-filled B
178c0 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
178d0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
178e0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
178f0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
17900 6c 6f 62 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  lob64(.  void * 
17910 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
17920 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17930 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17950 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17960 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
17970 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c    int idx;.  Tcl
17980 5f 57 69 64 65 49 6e 74 20 6e 3b 0a 20 20 69 6e  _WideInt n;.  in
17990 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
179a0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
179b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
179c0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
179d0 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20  TMT IDX N");.   
179e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
179f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
17a00 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17a10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17a20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17a30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17a40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17a50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17a60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17a70 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17a80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17a90 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
17aa0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17ab0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
17ac0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17ad0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
17ae0 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
17af0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
17b00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
17b10 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
17b20 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
17b30 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
17b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17b60 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17b70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
17b80 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17b90 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
17ba0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17bb0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
17bc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17bd0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17be0 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41  d_int  STMT N VA
17bf0 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
17c00 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
17c10 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  int interface.  
17c20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
17c30 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
17c40 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
17c50 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
17c60 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
17c70 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
17c80 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17c90 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
17ca0 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
17cb0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
17cc0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
17cd0 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 69  LAPI test_bind_i
17ce0 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
17cf0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17d00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17d10 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17d20 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17d30 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17d40 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17d50 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61  nt idx;.  int va
17d60 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
17d70 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
17d80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17d90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17da0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17db0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17dc0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17dd0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17de0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
17df0 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
17e00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17e10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
17e20 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
17e30 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17e40 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
17e50 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17e60 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
17e70 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
17e80 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
17e90 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
17ea0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17eb0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17ec0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
17ed0 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
17ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17ef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
17f00 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  ind_int(pStmt, i
17f10 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
17f20 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17f30 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
17f40 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
17f50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17f60 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
17f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17f90 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
17fa0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
17fb0 2a 2a 20 55 73 61 67 65 3a 20 20 20 69 6e 74 61  ** Usage:   inta
17fc0 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20 20  rray_addr  INT  
17fd0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
17fe0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
17ff0 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72  a C-language arr
18000 61 79 20 6f 66 20 33 32 2d 62 69 74 20 69 6e 74  ay of 32-bit int
18010 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  egers..**.** Spa
18020 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  ce to hold the a
18030 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
18040 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20   from malloc(). 
18050 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65   Call this proce
18060 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74  dure once.** wit
18070 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69  h no arguments i
18080 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61  n order to relea
18090 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68  se memory.  Each
180a0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72   call to this pr
180b0 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77  ocedure.** overw
180c0 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
180d0 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  us array..*/.sta
180e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
180f0 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 61 72  CLAPI test_intar
18100 72 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64  ray_addr(.  void
18110 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18120 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18130 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18140 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18150 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
18160 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  t i;.  static in
18170 74 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  t *p = 0;..  sql
18180 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18190 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a  p = 0;.  if( obj
181a0 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  c>1 ){.    p = s
181b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
181c0 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a  izeof(p[0])*(obj
181d0 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  c-1) );.    if( 
181e0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  p==0 ) return TC
181f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72  L_ERROR;.    for
18200 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20  (i=0; i<objc-1; 
18210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
18220 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
18230 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
18240 2b 69 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20  +i], &p[i]) ){. 
18250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
18260 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
18270 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  p = 0;.        r
18280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
182a0 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62   }  .  Tcl_SetOb
182b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
182c0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
182d0 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  j((sqlite3_int64
182e0 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  )p));.  return T
182f0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55  CL_OK;.}./*.** U
18300 73 61 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79  sage:   intarray
18310 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a  _addr  INT  ....
18320 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18330 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d   address of a C-
18340 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f  language array o
18350 66 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  f 32-bit integer
18360 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
18370 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
18380 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
18390 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
183a0 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
183b0 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
183c0 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
183d0 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
183e0 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
183f0 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
18400 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
18410 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
18420 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
18430 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
18440 49 20 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61  I test_int64arra
18450 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a  y_addr(.  void *
18460 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18470 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18480 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18490 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
184a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
184b0 69 3b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  i;.  static sqli
184c0 74 65 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30  te3_int64 *p = 0
184d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
184e0 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20  e(p);.  p = 0;. 
184f0 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20   if( objc>1 ){. 
18500 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
18510 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b  alloc( sizeof(p[
18520 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a  0])*(objc-1) );.
18530 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
18540 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18550 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18560 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  objc-1; i++){.  
18570 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
18580 76 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  v;.      if( Tcl
18590 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
185a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
185b0 31 2b 69 5d 2c 20 26 76 29 20 29 7b 0a 20 20 20  1+i], &v) ){.   
185c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
185d0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
185e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
185f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 5b 69       }.      p[i
18610 5d 20 3d 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = v;.    }.  }
18620 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
18630 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18640 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
18650 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
18660 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18670 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
18680 67 65 3a 20 20 20 64 6f 75 62 6c 65 61 72 72 61  ge:   doublearra
18690 79 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e  y_addr  INT  ...
186a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
186b0 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43  e address of a C
186c0 2d 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20  -language array 
186d0 6f 66 20 64 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a  of doubles..**.*
186e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
186f0 74 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  the array is obt
18700 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
18710 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20  c().  Call this 
18720 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a  procedure once.*
18730 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * with no argume
18740 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  nts in order to 
18750 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20  release memory. 
18760 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   Each call to th
18770 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  is procedure.** 
18780 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
18790 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a  revious array..*
187a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
187b0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
187c0 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72  doublearray_addr
187d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
187e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
187f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18800 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18810 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18820 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
18830 74 61 74 69 63 20 64 6f 75 62 6c 65 20 2a 70 20  tatic double *p 
18840 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
18850 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30  free(p);.  p = 0
18860 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29  ;.  if( objc>1 )
18870 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
18880 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
18890 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20  (p[0])*(objc-1) 
188a0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
188b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
188c0 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OR;.    for(i=0;
188d0 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b   i<objc-1; i++){
188e0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
188f0 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
18900 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69  interp, objv[1+i
18910 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20  ], &p[i]) ){.   
18920 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
18930 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
18940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
18950 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18970 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
18980 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18990 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
189a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
189b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
189c0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
189d0 67 65 3a 20 20 20 74 65 78 74 61 72 72 61 79 5f  ge:   textarray_
189e0 61 64 64 72 20 20 54 45 58 54 20 2e 2e 2e 0a 2a  addr  TEXT ....*
189f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18a00 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
18a10 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
18a20 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20   strings..**.** 
18a30 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
18a40 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
18a50 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
18a60 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
18a70 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
18a80 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
18a90 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
18aa0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
18ab0 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
18ac0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
18ad0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
18ae0 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
18af0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
18b00 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 65  E_TCLAPI test_te
18b10 78 74 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  xtarray_addr(.  
18b20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18b30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18b40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18b50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18b60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18b70 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
18b80 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 73  c int n = 0;.  s
18b90 74 61 74 69 63 20 63 68 61 72 20 2a 2a 70 20 3d  tatic char **p =
18ba0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
18bb0 69 3c 6e 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65  i<n; i++) sqlite
18bc0 33 5f 66 72 65 65 28 70 5b 69 5d 29 3b 0a 20 20  3_free(p[i]);.  
18bd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
18be0 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  p = 0;.  if( 
18bf0 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20  objc>1 ){.    p 
18c00 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
18c10 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28  ( sizeof(p[0])*(
18c20 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69  objc-1) );.    i
18c30 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
18c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18c50 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d  for(i=0; i<objc-
18c60 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  1; i++){.      p
18c70 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [i] = sqlite3_mp
18c80 72 69 6e 74 66 28 22 25 73 22 2c 20 54 63 6c 5f  rintf("%s", Tcl_
18c90 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18ca0 2b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  +i]));.    }.  }
18cb0 0a 20 20 6e 20 3d 20 6f 62 6a 63 2d 31 3b 0a 20  .  n = objc-1;. 
18cc0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18cd0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18ce0 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
18cf0 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
18d00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18d10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
18d20 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
18d30 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
18d40 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
18d50 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
18d60 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
18d70 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
18d80 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
18d90 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
18da0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
18db0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
18dc0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
18dd0 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
18de0 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
18df0 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
18e00 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
18e10 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18e20 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
18e30 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  d_int64(.  void 
18e40 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18e50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18e60 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18e70 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18e80 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18e90 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18ea0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54  ;.  int idx;.  T
18eb0 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c 75 65  cl_WideInt value
18ec0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
18ed0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
18ee0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18ef0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18f00 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18f10 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
18f20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
18f30 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
18f40 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
18f50 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
18f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f70 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18f80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18f90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18fa0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18fb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18fc0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18fd0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18fe0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
18ff0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
19000 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
19010 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
19020 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
19030 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
19040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19060 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
19070 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
19080 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19090 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
190a0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
190b0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
190c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
190d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
190e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
190f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
19100 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
19110 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
19120 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
19130 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  le  STMT N VALUE
19140 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
19150 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
19160 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ble interface.  
19170 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
19180 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
19190 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
191a0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
191b0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
191c0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
191d0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
191e0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
191f0 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
19200 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
19210 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
19220 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 64  LAPI test_bind_d
19230 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
19240 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19250 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19260 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19270 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19280 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19290 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
192a0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
192b0 62 6c 65 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20  ble value = 0;. 
192c0 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
192d0 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69   char *zVal;.  i
192e0 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63  nt i;.  static c
192f0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
19300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
19310 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
19320 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
19330 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19340 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69  alue */.    unsi
19350 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b  gned int iUpper;
19360 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62     /* Upper 32 b
19370 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  its */.    unsig
19380 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20  ned int iLower; 
19390 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69    /* Lower 32 bi
193a0 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69  ts */.  } aSpeci
193b0 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  alFp[] = {.    {
193c0 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78    "NaN",      0x
193d0 37 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  7fffffff, 0xffff
193e0 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
193f0 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66  SNaN",     0x7ff
19400 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
19410 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  f },.    {  "-Na
19420 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66  N",     0xffffff
19430 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
19440 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22  ,.    {  "-SNaN"
19450 2c 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c  ,    0xfff7ffff,
19460 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
19470 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20     {  "+Inf",   
19480 20 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78    0x7ff00000, 0x
19490 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
194a0 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30  {  "-Inf",     0
194b0 78 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  xfff00000, 0x000
194c0 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
194d0 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30  "Epsilon",  0x00
194e0 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
194f0 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45  01 },.    {  "-E
19500 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30  psilon", 0x80000
19510 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
19520 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22  },.    {  "NaN0"
19530 2c 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30  ,     0x7ff80000
19540 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
19550 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20      {  "-NaN0", 
19560 20 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30     0xfff80000, 0
19570 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d  x00000000 },.  }
19580 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
19590 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
195a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
195b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
195c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
195d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
195e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
195f0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
19600 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
19610 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19620 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
19630 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19640 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19650 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19660 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19670 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19680 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
19690 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
196a0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
196b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
196c0 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65  /* Intercept the
196d0 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e   string "NaN" an
196e0 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e  d generate a NaN
196f0 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20   value for it.. 
19700 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74   ** All other st
19710 72 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64  rings are passed
19720 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f   through to Tcl_
19730 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
19740 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74  ()..  ** Tcl_Get
19750 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20  DoubleFromObj() 
19760 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e  should understan
19770 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65  d "NaN" but some
19780 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63   versions.  ** c
19790 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20  ontain a bug..  
197a0 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f  */.  zVal = Tcl_
197b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
197c0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
197d0 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  <sizeof(aSpecial
197e0 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63  Fp)/sizeof(aSpec
197f0 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b  ialFp[0]); i++){
19800 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
19810 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e  aSpecialFp[i].zN
19820 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b  ame, zVal)==0 ){
19830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
19840 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78  int64 x;.      x
19850 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d   = aSpecialFp[i]
19860 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78  .iUpper;.      x
19870 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78   <<= 32;.      x
19880 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69   |= aSpecialFp[i
19890 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20  ].iLower;.      
198a0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
198b0 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20  alue)==8 );.    
198c0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
198d0 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  (x)==8 );.      
198e0 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26  memcpy(&value, &
198f0 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65  x, 8);.      bre
19900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
19910 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53  if( i>=sizeof(aS
19920 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
19930 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20  (aSpecialFp[0]) 
19940 26 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f  &&.         Tcl_
19950 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
19960 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
19970 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20  , &value) ){.   
19980 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19990 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
199a0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
199b0 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
199c0 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
199d0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
199e0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
199f0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
19a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19a30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19a40 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
19a50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19a60 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
19a70 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a  d_null  STMT N.*
19a80 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
19a90 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20  lite3_bind_null 
19aa0 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
19ab0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
19ac0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
19ad0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
19ae0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
19af0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
19b00 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
19b10 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55  nd.** binds a NU
19b20 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  LL to the wildca
19b30 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
19b40 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
19b50 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
19b60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19b70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19b80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19b90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19ba0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19bb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
19bc0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
19bd0 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
19be0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
19bf0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19c00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19c10 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19c20 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
19c30 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19c40 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
19c50 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20   0), " STMT N", 
19c60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19c70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19c80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19c90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19ca0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19cb0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19cc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19cd0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19ce0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19cf0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
19d00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19d10 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
19d20 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
19d30 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
19d40 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19d50 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
19d60 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
19d70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19d80 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
19d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19da0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19db0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
19dc0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19dd0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19de0 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54  _bind_text  STMT
19df0 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
19e00 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
19e10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
19e20 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
19e30 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
19e40 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
19e50 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
19e60 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
19e70 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
19e80 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
19e90 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
19ea0 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49  TF-8 string STRI
19eb0 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
19ec0 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
19ed0 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
19ee0 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
19ef0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
19f00 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  API test_bind_te
19f10 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
19f20 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19f30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19f40 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19f50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19f60 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19f70 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19f80 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
19f90 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
19fa0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
19fb0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
19fc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19fd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19fe0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19ff0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
1a000 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1a010 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
1a020 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
1a030 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
1a040 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a050 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a060 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1a070 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a080 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a090 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1a0a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a0b0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a0c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a0d0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
1a0e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a0f0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
1a100 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1a110 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
1a120 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20   &bytes);.  if( 
1a130 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1a140 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
1a150 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1a160 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1a180 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
1a190 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
1a1a0 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
1a1b0 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ENT);.  if( sqli
1a1c0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a1d0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
1a1e0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
1a1f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a210 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
1a220 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a230 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
1a240 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
1a250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a260 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1a270 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1a280 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1a290 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d  3_bind_text16 ?-
1a2a0 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53  static? STMT N S
1a2b0 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
1a2c0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
1a2d0 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69  e3_bind_text16 i
1a2e0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
1a2f0 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
1a300 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
1a310 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1a320 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
1a330 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1a340 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
1a350 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
1a360 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e  -16 string STRIN
1a370 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
1a380 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
1a390 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
1a3a0 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
1a3b0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1a3c0 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  PI test_bind_tex
1a3d0 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t16(.  void * cl
1a3e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a3f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a400 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a410 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1a420 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1a430 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a440 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a450 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
1a460 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
1a470 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
1a480 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64   int rc;..  void
1a490 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
1a4a0 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54  = (objc==6?SQLIT
1a4b0 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f  E_STATIC:SQLITE_
1a4c0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63  TRANSIENT);.  Tc
1a4d0 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20  l_Obj *oStmt    
1a4e0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a  = objv[objc-4];.
1a4f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20    Tcl_Obj *oN   
1a500 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
1a510 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  3];.  Tcl_Obj *o
1a520 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f  String  = objv[o
1a530 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-2];.  Tcl_Ob
1a540 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62  j *oBytes   = ob
1a550 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69  jv[objc-1];..  i
1a560 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1a570 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f  jc!=6){.    Tcl_
1a580 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a590 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a5a0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a5b0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
1a5c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1a5d0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
1a5e0 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
1a5f0 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
1a600 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a610 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1a620 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a630 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53  Tcl_GetString(oS
1a640 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20  tmt), &pStmt) ) 
1a650 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a660 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1a670 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1a680 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65  , oN, &idx) ) re
1a690 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a6a0 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
1a6b0 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
1a6c0 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67  yFromObj(oString
1a6d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  , 0);.  if( Tcl_
1a6e0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a6f0 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62  terp, oBytes, &b
1a700 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1a710 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1a720 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
1a730 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78  ext16(pStmt, idx
1a740 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c  , (void *)value,
1a750 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20   bytes, xDel);. 
1a760 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a770 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a780 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
1a790 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a7a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1a7b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a7c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a7d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
1a7e0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
1a7f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a810 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a820 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1a830 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a840 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a850 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1a860 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  lob ?-static? ST
1a870 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a  MT N DATA BYTES.
1a880 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
1a890 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1a8a0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
1a8b0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
1a8c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
1a8d0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1a8e0 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
1a8f0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1a900 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
1a910 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42  and.** binds a B
1a920 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
1a930 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69  ard.  The BLOB i
1a940 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e  s BYTES bytes in
1a950 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1a960 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1a970 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f  PI test_bind_blo
1a980 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
1a990 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a9a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a9b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a9c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a9d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1a9e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1a9f0 74 20 6c 65 6e 2c 20 69 64 78 3b 0a 20 20 69 6e  t len, idx;.  in
1aa00 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
1aa10 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
1aa20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74  ;.  sqlite3_dest
1aa30 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73  ructor_type xDes
1aa40 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
1aa50 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69  _TRANSIENT;..  i
1aa60 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1aa70 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=6 ){.    Tcl
1aa80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1aa90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1aaa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1aab0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
1aac0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1aad0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
1aae0 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
1aaf0 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
1ab00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ab10 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36  }..  if( objc==6
1ab20 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63   ){.    xDestruc
1ab30 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41  tor = SQLITE_STA
1ab40 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b  TIC;.    objv++;
1ab50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1ab60 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1ab70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ab80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1ab90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1aba0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1abb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1abc0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1abd0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
1abe0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 76 61 6c  CL_ERROR;..  val
1abf0 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
1ac00 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1ac10 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65  Obj(objv[3], &le
1ac20 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  n);.  if( Tcl_Ge
1ac30 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1ac40 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
1ac50 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1ac60 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
1ac70 62 79 74 65 73 3e 6c 65 6e 20 29 7b 0a 20 20 20  bytes>len ){.   
1ac80 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
1ac90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1aca0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1acb0 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1acd0 63 61 6e 6e 6f 74 20 75 73 65 20 25 64 20 62 6c  cannot use %d bl
1ace0 6f 62 20 62 79 74 65 73 2c 20 68 61 76 65 20 25  ob bytes, have %
1acf0 64 22 2c 20 62 79 74 65 73 2c 20 6c 65 6e 29 3b  d", bytes, len);
1ad00 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1ad10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1ad20 75 66 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  uf, -1);.    ret
1ad30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ad40 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
1ad50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
1ad60 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
1ad70 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
1ad80 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
1ad90 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1ada0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
1adb0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
1adc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1add0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ade0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1adf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ae00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ae10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1ae20 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
1ae30 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
1ae40 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
1ae50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ae60 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
1ae70 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
1ae80 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1ae90 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1aea0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
1aeb0 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ter_count(.  voi
1aec0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1aed0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1aee0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1aef0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1af00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1af10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1af20 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1af30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1af40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1af50 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
1af60 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
1af70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1af80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1af90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1afa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1afb0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1afc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1afd0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1afe0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1aff0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1b000 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b010 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1b020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b040 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b050 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20  parameter_name  
1b060 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65  STMT  N.**.** Re
1b070 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
1b080 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72   the Nth wildcar
1b090 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69  d.  The first wi
1b0a0 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20  ldcard is 1..** 
1b0b0 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
1b0c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e  is returned if N
1b0d0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1b0e0 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
1b0f0 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65  ard.** is namele
1b100 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
1b110 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1b120 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
1b130 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64  ter_name(.  void
1b140 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b150 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b160 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b170 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b180 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1b190 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b1a0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  t;.  int i;..  i
1b1b0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1b1c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b1d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b1e0 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20  jv, "STMT N");. 
1b1f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b200 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1b210 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1b220 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1b230 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1b240 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1b250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1b260 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1b270 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1b280 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e 20  ], &i) ) return 
1b290 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1b2a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1b2b0 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
1b2c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
1b2d0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1b2e0 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ter_name(pStmt,i
1b2f0 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74  ),-1).  );.  ret
1b300 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b310 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1b320 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1b330 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54  eter_index  STMT
1b340 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74    NAME.**.** Ret
1b350 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1b360 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 61   the wildcard ca
1b370 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75  lled NAME.  Retu
1b380 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73  rn 0 if there is
1b390 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64  .** no such wild
1b3a0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
1b3b0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1b3c0 49 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  I test_bind_para
1b3d0 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76  meter_index(.  v
1b3e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b3f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b400 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b410 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b420 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b430 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b440 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1b450 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1b460 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b470 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b480 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20  TMT NAME");.    
1b490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b4a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
1b4b0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1b4c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b4d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1b4e0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1b4f0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1b500 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b510 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49  , .     Tcl_NewI
1b520 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71  ntObj(.       sq
1b530 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1b540 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74  eter_index(pStmt
1b550 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  ,Tcl_GetString(o
1b560 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a  bjv[2])).     ).
1b570 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
1b580 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b590 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1b5a0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53  clear_bindings S
1b5b0 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  TMT.**.*/.static
1b5c0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1b5d0 50 49 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69  PI test_clear_bi
1b5e0 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a  ndings(.  void *
1b5f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b600 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b610 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b620 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b630 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1b640 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1b650 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1b660 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b670 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b680 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1b690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b6a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b6b0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1b6c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b6d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b6e0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1b6f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b700 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b710 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1b720 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c  ntObj(sqlite3_cl
1b730 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  ear_bindings(pSt
1b740 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
1b750 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b760 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1b770 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43  3_sleep MILLISEC
1b780 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONDS.*/.static i
1b790 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1b7a0 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
1b7b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b7c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b7d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b7e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b7f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b800 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
1b810 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1b820 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b830 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b840 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
1b850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b860 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b870 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b880 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b890 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
1b8a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b8b0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
1b8c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b8d0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1b8e0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
1b8f0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
1b900 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b910 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
1b920 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
1b930 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
1b940 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
1b950 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1b960 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
1b970 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
1b980 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
1b990 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
1b9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1b9b0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65  TE_TCLAPI test_e
1b9c0 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  x_errcode(.  voi
1b9d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b9e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b9f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ba00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1ba10 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1ba20 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1ba30 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1ba40 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1ba50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ba60 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ba70 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ba80 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1ba90 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1baa0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1bab0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bac0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1bad0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1bae0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1baf0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1bb00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bb10 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1bb20 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1bb30 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41  ode(db);.  Tcl_A
1bb40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1bb50 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
1bb60 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
1bb70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bb80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
1bb90 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  e: sqlite3_errco
1bba0 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
1bbb0 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
1bbc0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1bbd0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1bbe0 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
1bbf0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
1bc00 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
1bc10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1bc30 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f  st_errcode(.  vo
1bc40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1bc50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1bc60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1bc70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1bc80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1bc90 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1bca0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1bcb0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1bcc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bcd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1bce0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1bcf0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1bd00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1bd10 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
1bd20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bd30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1bd40 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1bd50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1bd60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1bd70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1bd80 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1bd90 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1bda0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1bdb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1bdc0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1bdd0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1bde0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1bdf0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1be00 74 65 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a  te3_errmsg DB.**
1be10 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
1be20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61  UTF-8 representa
1be30 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
1be40 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
1be50 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   for the.** most
1be60 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
1be70 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  * API call..*/.s
1be80 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1be90 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72  _TCLAPI test_err
1bea0 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
1beb0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1bec0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bed0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bee0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bef0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1bf00 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
1bf10 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
1bf20 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1bf30 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bf40 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1bf50 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1bf60 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1bf70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1bf80 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
1bf90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1bfa0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1bfb0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1bfc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1bfd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1bfe0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1bff0 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
1c000 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
1c010 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
1c020 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1c030 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1c040 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
1c050 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c060 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1c070 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
1c080 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
1c090 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
1c0a0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1c0b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1c0c0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
1c0d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1c0e0 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
1c0f0 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
1c100 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
1c110 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
1c120 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
1c130 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
1c140 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
1c150 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
1c160 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
1c170 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
1c180 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1c190 49 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28  I test_errmsg16(
1c1a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c1b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c1c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c1d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c1e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c1f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1c200 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1c210 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1c220 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a  nst void *zErr;.
1c230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1c240 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
1c250 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1c260 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c270 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c280 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c290 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c2a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c2b0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c2c0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1c2d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c2e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1c2f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1c300 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c310 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1c320 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c330 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
1c340 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
1c350 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
1c360 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20    z = zErr;.    
1c370 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62  for(bytes=0; z[b
1c380 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73  ytes] || z[bytes
1c390 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d  +1]; bytes+=2){}
1c3a0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
1c3b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c3c0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1c3d0 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29  Obj(zErr, bytes)
1c3e0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1c3f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c400 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1c410 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c420 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1c430 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  re DB sql bytes 
1c440 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
1c450 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
1c460 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
1c470 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
1c480 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
1c490 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
1c4a0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
1c4b0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
1c4c0 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
1c4d0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
1c4e0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
1c4f0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
1c500 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
1c510 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
1c520 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
1c530 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1c540 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c550 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70  TCLAPI test_prep
1c560 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  are(.  void * cl
1c570 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c580 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c590 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c5a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c5b0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c5c0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
1c5d0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
1c5e0 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
1c5f0 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
1c600 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c610 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1c620 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
1c630 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1c640 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
1c650 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c660 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c670 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c680 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1c690 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c6a0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1c6b0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1c6c0 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
1c6d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c6e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1c6f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1c700 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c710 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1c720 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c730 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1c740 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1c750 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
1c760 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1c770 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
1c780 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1c790 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
1c7a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c7b0 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1c7c0 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1c7d0 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1c7e0 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
1c7f0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
1c800 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1c810 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1c820 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1c830 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a  L_ERROR;.  if( z
1c840 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20  Tail && objc>=5 
1c850 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73  ){.    if( bytes
1c860 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74  >=0 ){.      byt
1c870 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e  es = bytes - (in
1c880 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a  t)(zTail-zSql);.
1c890 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 69      }.    if( (i
1c8a0 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29  nt)strlen(zTail)
1c8b0 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20  <bytes ){.      
1c8c0 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73 74 72  bytes = (int)str
1c8d0 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20 20  len(zTail);.    
1c8e0 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
1c8f0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1c900 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
1c910 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
1c920 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
1c930 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1c950 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
1c960 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1c970 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1c980 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
1c990 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
1c9a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c9b0 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
1c9c0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
1c9d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c9e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c9f0 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1ca00 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1ca10 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1ca20 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
1ca30 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1ca40 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
1ca50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ca60 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1ca70 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1ca80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ca90 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1caa0 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74  re_v2 DB sql byt
1cab0 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  es ?tailvar?.**.
1cac0 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
1cad0 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
1cae0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
1caf0 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
1cb00 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
1cb10 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
1cb20 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
1cb30 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
1cb40 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
1cb50 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
1cb60 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
1cb70 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
1cb80 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
1cb90 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
1cba0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1cbb0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1cbc0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
1cbd0 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69  repare_v2(.  voi
1cbe0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1cbf0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cc00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cc10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cc20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1cc30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1cc40 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
1cc50 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
1cc60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cc70 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f    /* malloc() co
1cc80 70 79 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20  py of zSql */.  
1cc90 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
1cca0 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
1ccb0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1ccc0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1ccd0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1cce0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1ccf0 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1cd00 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1cd10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1cd20 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1cd30 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1cd40 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1cd50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1cd60 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1cd70 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
1cd80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cd90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1cda0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1cdb0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cdc0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1cdd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1cde0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1cdf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ce00 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
1ce10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1ce20 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1ce30 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1ce40 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  TCL_ERROR;..  /*
1ce50 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e   Instead of usin
1ce60 67 20 7a 53 71 6c 20 64 69 72 65 63 74 6c 79 2c  g zSql directly,
1ce70 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 69 6e 74   make a copy int
1ce80 6f 20 61 20 62 75 66 66 65 72 20 6f 62 74 61 69  o a buffer obtai
1ce90 6e 65 64 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c  ned.  ** directl
1cea0 79 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  y from malloc().
1ceb0 20 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20   The idea is to 
1cec0 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 66  make it easier f
1ced0 6f 72 20 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a  or valgrind.  **
1cee0 20 74 6f 20 73 70 6f 74 20 62 75 66 66 65 72 20   to spot buffer 
1cef0 6f 76 65 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20  overreads.  */. 
1cf00 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
1cf10 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c  .    zCopy = mal
1cf20 6c 6f 63 28 62 79 74 65 73 29 3b 0a 20 20 20 20  loc(bytes);.    
1cf30 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
1cf40 71 6c 2c 20 62 79 74 65 73 29 3b 0a 20 20 7d 65  ql, bytes);.  }e
1cf50 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  lse{.    int n =
1cf60 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71   (int)strlen(zSq
1cf70 6c 29 20 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70  l) + 1;.    zCop
1cf80 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20  y = malloc(n);. 
1cf90 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
1cfa0 20 7a 53 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20   zSql, n);.  }. 
1cfb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1cfc0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f  epare_v2(db, zCo
1cfd0 70 79 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  py, bytes, &pStm
1cfe0 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1cff0 61 69 6c 20 3a 20 30 29 3b 0a 20 20 66 72 65 65  ail : 0);.  free
1d000 28 7a 43 6f 70 79 29 3b 0a 20 20 7a 54 61 69 6c  (zCopy);.  zTail
1d010 20 3d 20 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20   = &zSql[(zTail 
1d020 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a 20 20 61 73  - zCopy)];..  as
1d030 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
1d040 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
1d050 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
1d060 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
1d070 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1d080 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1d090 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1d0a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1d0b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d0c0 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
1d0d0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
1d0e0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
1d0f0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
1d100 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
1d110 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
1d120 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1d130 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
1d140 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1d150 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
1d160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1d170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d180 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
1d190 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1d1a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1d1b0 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28  (zBuf), zBuf, "(
1d1c0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
1d1d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d1e0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
1d1f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
1d200 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
1d210 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d220 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1d230 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1d240 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1d250 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1d260 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1d270 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1d280 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d290 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1d2a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d2b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d2c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d2d0 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20  prepare_tkt3134 
1d2e0 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  DB.**.** Generat
1d2f0 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
1d300 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72  tement for a zer
1d310 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73  o-byte string as
1d320 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74   a test.** for t
1d330 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68  icket #3134.  Th
1d340 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  e string should 
1d350 62 65 20 70 72 65 63 65 64 65 64 20 62 79 20 61  be preceded by a
1d360 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73   zero byte..*/.s
1d370 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1d380 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65  _TCLAPI test_pre
1d390 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20  pare_tkt3134(.  
1d3a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1d3b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1d3c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d3d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d3e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d3f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1d400 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1d410 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30  ar zSql[] = "\00
1d420 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71  0SELECT 1";.  sq
1d430 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d440 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1d450 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
1d460 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1d470 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d480 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d490 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1d4a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1d4b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1d4c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1d4d0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1d4e0 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1d4f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d500 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1d510 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1d520 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d530 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1d540 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d550 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d560 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1d570 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53  &zSql[1], 0, &pS
1d580 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  tmt, 0);.  asser
1d590 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
1d5a0 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
1d5b0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1d5c0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1d5d0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1d5e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d5f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d600 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1d610 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1d620 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1d630 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1d640 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1d650 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d660 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1d670 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1d680 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1d690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d6a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1d6b0 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1d6c0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1d6d0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1d6e0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1d6f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d700 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d710 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1d720 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1d730 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d740 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d750 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44  ite3_prepare16 D
1d760 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1d770 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
1d780 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1d790 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1d7a0 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1d7b0 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1d7c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1d7d0 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1d7e0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1d7f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1d800 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1d810 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1d820 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1d830 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1d840 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1d850 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1d860 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1d870 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1d880 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28   test_prepare16(
1d890 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d8a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d8b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d8c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d8d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d8e0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1d8f0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1d900 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1d910 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1d920 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1d930 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1d940 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1d950 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d960 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1d970 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1d980 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1d990 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1d9a0 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1d9b0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1d9c0 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1d9d0 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1d9e0 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1d9f0 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1da00 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1da10 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1da20 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1da30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1da40 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1da50 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1da60 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1da70 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1da80 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1da90 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1daa0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1dab0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1dac0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1dad0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1dae0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1daf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1db00 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1db10 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1db20 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1db30 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1db40 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1db50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1db60 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1db70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1db80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1db90 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c  epare16(db, zSql
1dba0 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1dbb0 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1dbc0 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1dbd0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1dbe0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1dbf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1dc00 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1dc10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1dc20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1dc30 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1dc40 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1dc50 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1dc60 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1dc70 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1dc80 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1dc90 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1dca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1dcb0 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1dcc0 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1dcd0 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1dce0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1dcf0 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1dd00 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1dd10 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1dd20 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1dd30 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1dd40 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1dd50 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1dd60 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1dd70 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1dd80 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1dd90 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1dda0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1ddb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ddc0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1ddd0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1dde0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1ddf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1de00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1de10 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1de20 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79  e16_v2 DB sql by
1de30 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a  tes ?tailvar?.**
1de40 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
1de50 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
1de60 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1de70 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
1de80 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
1de90 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
1dea0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
1deb0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
1dec0 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
1ded0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
1dee0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
1def0 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
1df00 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
1df10 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
1df20 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1df30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1df40 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1df50 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20  prepare16_v2(.  
1df60 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1df70 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1df80 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1df90 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1dfa0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1dfb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dfc0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1dfd0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1dfe0 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
1dff0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
1e000 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1e010 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
1e020 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e030 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1e040 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
1e050 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e070 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
1e080 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
1e090 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
1e0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e0b0 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
1e0c0 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
1e0d0 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
1e0e0 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1e0f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e110 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e120 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e130 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e140 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1e150 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1e160 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1e170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e180 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1e190 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1e1a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e1b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1e1c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e1d0 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1e1e0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1e1f0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1e200 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1e210 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1e220 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1e230 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1e240 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1e250 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1e260 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
1e270 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1e280 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1e290 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1e2a0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1e2b0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1e2c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e2d0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1e2e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e2f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e300 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1e310 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1e320 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1e330 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1e340 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1e350 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1e360 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1e370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1e380 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1e390 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1e3a0 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1e3b0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1e3c0 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1e3d0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1e3e0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1e3f0 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1e400 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1e410 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1e420 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1e430 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1e440 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1e450 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1e460 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1e470 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1e480 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e490 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1e4a0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1e4b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1e4c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e4d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e4e0 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66  : sqlite3_open f
1e4f0 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73  ilename ?options
1e500 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63  -list?.*/.static
1e510 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1e520 50 49 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20  PI test_open(.  
1e530 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e540 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e550 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e560 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e570 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e580 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1e590 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
1e5a0 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a  e3 *db;.  char z
1e5b0 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
1e5c0 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
1e5d0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29  !=2 && objc!=1 )
1e5e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e5f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e600 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e610 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e620 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e630 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
1e640 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d  ilename options-
1e650 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72  list", 0);.    r
1e660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e670 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d  .  }..  zFilenam
1e680 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c  e = objc>1 ? Tcl
1e690 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e6a0 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74  1]) : 0;.  sqlit
1e6b0 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  e3_open(zFilenam
1e6c0 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
1e6d0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1e6e0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1e6f0 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1e700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e710 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1e720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1e730 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1e740 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e750 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e760 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45  open_v2 FILENAME
1e770 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74   FLAGS VFS.*/.st
1e780 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1e790 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e  TCLAPI test_open
1e7a0 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
1e7b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e7c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e7d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1e7e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e7f0 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
1e800 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
1e810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1e820 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  fs;.  int flags 
1e830 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1e840 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
1e850 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1e860 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20  .  int nFlag;.  
1e870 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67  Tcl_Obj **apFlag
1e880 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1e890 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
1e8a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1e8b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1e8c0 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41  v, "FILENAME FLA
1e8d0 47 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65  GS VFS");.    re
1e8e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e8f0 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
1e900 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1e910 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73  objv[1]);.  zVfs
1e920 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1e930 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
1e940 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29   zVfs[0]==0x00 )
1e950 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63   zVfs = 0;..  rc
1e960 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65   = Tcl_ListObjGe
1e970 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
1e980 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61  , objv[2], &nFla
1e990 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69  g, &apFlag);.  i
1e9a0 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1e9b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72  return rc;.  for
1e9c0 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69  (i=0; i<nFlag; i
1e9d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c  ++){.    int iFl
1e9e0 61 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f  ag;.    struct O
1e9f0 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20  penFlag {.      
1ea00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61  const char *zFla
1ea10 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  g;.      int fla
1ea20 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d  g;.    } aFlag[]
1ea30 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51   = {.      { "SQ
1ea40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1ea50 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY", SQLITE_OPEN
1ea60 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
1ea70 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ea80 4e 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51  N_READWRITE", SQ
1ea90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1eaa0 49 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ITE },.      { "
1eab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1eac0 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1ead0 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
1eae0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1eaf0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20  DELETEONCLOSE", 
1eb00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1eb10 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20  TEONCLOSE },.   
1eb20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1eb30 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51  N_EXCLUSIVE", SQ
1eb40 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1eb50 49 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  IVE },.      { "
1eb60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
1eb70 50 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f  PROXY", SQLITE_O
1eb80 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c  PEN_AUTOPROXY },
1eb90 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1eba0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20  _OPEN_MAIN_DB", 
1ebb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ebc0 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1ebd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1ebe0 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1ebf0 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20  N_TEMP_DB },.   
1ec00 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ec10 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c  N_TRANSIENT_DB",
1ec20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
1ec30 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20  NSIENT_DB },.   
1ec40 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ec50 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c  N_MAIN_JOURNAL",
1ec60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1ec70 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  N_JOURNAL },.   
1ec80 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ec90 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c  N_TEMP_JOURNAL",
1eca0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1ecb0 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  P_JOURNAL },.   
1ecc0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ecd0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53  N_SUBJOURNAL", S
1ece0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1ecf0 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  URNAL },.      {
1ed00 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   "SQLITE_OPEN_MA
1ed10 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53  STER_JOURNAL", S
1ed20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1ed30 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  R_JOURNAL },.   
1ed40 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ed50 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49  N_NOMUTEX", SQLI
1ed60 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
1ed70 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ed80 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1ed90 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  X", SQLITE_OPEN_
1eda0 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20  FULLMUTEX },.   
1edb0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1edc0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20  N_SHAREDCACHE", 
1edd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
1ede0 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
1edf0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ee00 50 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53  PRIVATECACHE", S
1ee10 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
1ee20 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
1ee30 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ee40 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL", SQLITE_OPE
1ee50 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  N_WAL },.      {
1ee60 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   "SQLITE_OPEN_UR
1ee70 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  I", SQLITE_OPEN_
1ee80 55 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30  URI },.      { 0
1ee90 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0 }.    };.   
1eea0 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
1eeb0 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
1eec0 69 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69  interp, apFlag[i
1eed0 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66  ], aFlag, sizeof
1eee0 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20  (aFlag[0]), .   
1eef0 20 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20       "flag", 0, 
1ef00 26 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20  &iFlag.    );.  
1ef10 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
1ef20 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ef30 20 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67    flags |= aFlag
1ef40 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20  [iFlag].flag;.  
1ef50 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1ef60 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e  3_open_v2(zFilen
1ef70 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c  ame, &db, flags,
1ef80 20 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71   zVfs);.  if( sq
1ef90 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1efa0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1efb0 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1efc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1efd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1efe0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1eff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f000 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f010 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1f020 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69  16 filename opti
1f030 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ons.*/.static in
1f040 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1f050 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76  test_open16(.  v
1f060 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f070 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f080 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f090 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f0a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1f0b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f0c0 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74  IT_UTF16.  const
1f0d0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
1f0e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1f0f0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1f100 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1f110 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1f120 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f130 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1f140 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1f150 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1f160 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1f170 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
1f180 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
1f190 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f1a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
1f1b0 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
1f1c0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1f1d0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71  bjv[1], 0);.  sq
1f1e0 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
1f1f0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1f200 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1f210 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1f220 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1f230 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1f240 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1f250 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f260 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1f270 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f280 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1f290 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f2a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f2b0 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
1f2c0 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
1f2d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1f2e0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
1f2f0 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
1f300 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
1f310 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
1f320 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1f330 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1f340 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6d 70 6c  CLAPI test_compl
1f350 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  ete16(.  void * 
1f360 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f370 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f380 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f390 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f3a0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65  bjv[].){.#if !de
1f3b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f3c0 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21  T_COMPLETE) && !
1f3d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f3e0 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61  MIT_UTF16).  cha
1f3f0 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20  r *zBuf;..  if( 
1f400 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f410 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f420 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f430 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29   "<utf-16 sql>")
1f440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
1f460 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  Buf = (char*)Tcl
1f470 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1f480 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1f490 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1f4a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1f4b0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1f4c0 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42  e3_complete16(zB
1f4d0 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  uf)));.#endif /*
1f4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1f4f0 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f  PLETE && SQLITE_
1f500 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1f510 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f520 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1f530 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54  qlite3_step STMT
1f540 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  .**.** Advance t
1f550 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
1f560 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f  the next row..*/
1f570 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1f580 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
1f590 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tep(.  void * cl
1f5a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f5b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f5c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1f5d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f5e0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1f5f0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1f600 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1f610 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1f620 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f630 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f640 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f650 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1f660 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f670 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29  0]), " STMT", 0)
1f680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f690 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1f6a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1f6b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1f6c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f6d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1f6e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f6f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1f700 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20  p(pStmt);..  /* 
1f710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
1f720 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ONE && rc!=SQLIT
1f730 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54  E_ROW ) return T
1f740 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54  CL_ERROR; */.  T
1f750 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1f760 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1f770 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1f780 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f790 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1f7a0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1f7b0 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20  est_sql(.  void 
1f7c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1f7d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f7e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1f7f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f800 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1f810 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1f820 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1f830 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1f840 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1f850 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
1f860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f870 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1f880 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1f890 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1f8a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1f8b0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1f8c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f8d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1f8e0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
1f8f0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
1f900 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
1f910 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f920 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
1f930 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1f940 73 74 5f 65 78 5f 73 71 6c 28 0a 20 20 76 6f 69  st_ex_sql(.  voi
1f950 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f960 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f970 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1f980 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1f990 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1f9a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1f9b0 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  mt;.  char *z;..
1f9c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1f9d0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1f9e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1f9f0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
1fa00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fa10 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1fa20 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1fa30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1fa40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1fa50 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1fa60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20   TCL_ERROR;.  z 
1fa70 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61 6e 64  = sqlite3_expand
1fa80 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  ed_sql(pStmt);. 
1fa90 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1faa0 6e 74 65 72 70 2c 20 7a 2c 20 54 43 4c 5f 56 4f  nterp, z, TCL_VO
1fab0 4c 41 54 49 4c 45 29 3b 0a 20 20 73 71 6c 69 74  LATILE);.  sqlit
1fac0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
1fad0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1fae0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1faf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
1fb00 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  t STMT .**.** Re
1fb10 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1fb20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  of columns retur
1fb30 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73  ned by the sql s
1fb40 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a  tatement STMT..*
1fb50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1fb60 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1fb70 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
1fb80 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1fb90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1fba0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1fbb0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1fbc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1fbd0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1fbe0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1fbf0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1fc00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1fc10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1fc20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1fc30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1fc40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1fc50 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1fc60 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1fc70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fc80 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1fc90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1fca0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1fcb0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1fcc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1fcd0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1fce0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1fcf0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1fd00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
1fd10 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
1fd20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fd30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1fd40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
1fd50 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1fd60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
1fd70 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
1fd80 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1fd90 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1fda0 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
1fdb0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1fdc0 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  PI test_column_t
1fdd0 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  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 20 20  _stmt *pStmt;.  
1fe40 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
1fe50 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
1fe60 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1fe70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fe80 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fe90 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fea0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1feb0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1fec0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1fed0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1fee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1fef0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1ff00 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1ff10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ff20 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1ff30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ff40 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1ff50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1ff60 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1ff70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ff80 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
1ff90 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1ffa0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
1ffb0 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
1ffc0 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
1ffd0 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
1ffe0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1fff0 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
20000 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
20010 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
20020 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
20030 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
20040 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
20050 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
20060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20070 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
20080 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
20090 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
200a0 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
200b0 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
200c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
200d0 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
200e0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
200f0 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
20100 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
20110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
20120 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
20130 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
20140 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
20150 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
20160 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20170 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
20180 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
20190 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
201a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
201b0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
201c0 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
201d0 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
201e0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
201f0 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
20200 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
20210 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
20220 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
20230 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
20240 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
20250 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
20260 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
20270 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20280 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20290 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
202a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
202b0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
202c0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
202d0 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61  t col;.  i64 iVa
202e0 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
202f0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
20300 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
20310 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
20320 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
20330 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
20340 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
20350 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
20360 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
20380 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
20390 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
203a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
203b0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
203c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
203d0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
203e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
203f0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
20400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20410 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c  R;..  iVal = sql
20420 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
20430 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  4(pStmt, col);. 
20440 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20450 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20460 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c  wWideIntObj(iVal
20470 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
20480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20490 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
204a0 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f  umn_blob STMT co
204b0 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
204c0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
204d0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
204e0 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
204f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20500 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20510 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20520 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20530 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
20540 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
20550 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65  t col;..  int le
20560 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  n;.  const void 
20570 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f  *pBlob;..  if( o
20580 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
20590 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
205a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
205b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
205c0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
205d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
205e0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
205f0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
20600 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20610 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
20620 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
20630 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
20640 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
20650 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20660 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
20670 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
20680 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
20690 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
206a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d  _ERROR;..  len =
206b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
206c0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c  bytes(pStmt, col
206d0 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  );.  pBlob = sql
206e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
206f0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
20700 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
20710 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
20720 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c  ByteArrayObj(pBl
20730 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74  ob, len));.  ret
20740 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20750 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
20760 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
20770 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
20780 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20790 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
207a0 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
207b0 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
207c0 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73  s a double..*/.s
207d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
207e0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c  _TCLAPI test_col
207f0 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  umn_double(.  vo
20800 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20810 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20820 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
20830 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
20840 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
20850 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
20860 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
20870 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a    double rVal;..
20880 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
20890 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
208a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
208b0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
208c0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
208d0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
208e0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
208f0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
20900 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20910 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
20920 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
20930 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20940 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20950 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
20960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
20970 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
20980 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
20990 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
209a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
209b0 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    rVal = sqlite3
209c0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
209d0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
209e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
209f0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f  nterp, Tcl_NewDo
20a00 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a  ubleObj(rVal));.
20a10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20a30 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f   sqlite3_data_co
20a40 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
20a50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
20a60 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
20a70 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
20a80 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
20a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
20aa0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
20ab0 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20  t_data_count(.  
20ac0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20ad0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20ae0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20af0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20b00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20b10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20b20 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
20b30 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20b40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20b50 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
20b60 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
20b70 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
20b80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
20b90 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
20ba0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
20bb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20bc0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
20bd0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20be0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20bf0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
20c00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20c10 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
20c20 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20c30 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
20c40 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
20c50 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
20c60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20c70 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
20c80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
20c90 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
20ca0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20cb0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
20cc0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
20cd0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
20ce0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
20cf0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
20d00 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20d10 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
20d20 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
20d30 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
20d40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20d50 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
20d60 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
20d70 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
20d80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20d90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20da0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20db0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20dc0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
20dd0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
20de0 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
20df0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20  3_stmt*, int);. 
20e00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
20e10 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  t;..  xFunc = (c
20e20 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73  onst char *(*)(s
20e30 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
20e40 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
20e50 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
20e60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
20e70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
20e80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
20e90 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
20ea0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
20eb0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
20ec0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
20ed0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20ee0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
20ef0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
20f00 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20f10 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20f20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
20f30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
20f40 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
20f50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
20f60 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
20f70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20f80 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
20f90 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
20fa0 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
20fb0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
20fc0 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
20fd0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
20fe0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
20ff0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
21000 4c 41 50 49 20 74 65 73 74 5f 67 6c 6f 62 61 6c  LAPI test_global
21010 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64  _recover(.  void
21020 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
21030 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21040 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21050 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21060 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
21070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21080 44 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e 74  DEPRECATED.  int
21090 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
210a0 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
210b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
210c0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
210d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
210e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
210f0 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  = sqlite3_global
21100 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63  _recover();.  Tc
21110 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
21120 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
21130 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
21140 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66  _STATIC);.#endif
21150 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
21170 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
21180 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
21190 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
211a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
211b0 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
211c0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
211d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
211e0 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
211f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
21200 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
21210 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76  _stmt_utf16(.  v
21220 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21230 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ,     /* Pointer
21240 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
21250 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
21260 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  voked */.  Tcl_I
21270 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
21280 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
21290 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
212a0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
212b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
212c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
212d0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
212e0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
212f0 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t;.  const void 
21300 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73  *zName16;.  cons
21310 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29  t void *(*xFunc)
21320 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
21330 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
21340 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a   (const void *(*
21350 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
21360 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
21370 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
21380 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
21390 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
213a0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
213b0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
213c0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
213d0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
213e0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
213f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21400 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
21410 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
21420 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
21430 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
21440 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
21450 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21460 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
21470 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
21480 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
21490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
214a0 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46  ..  zName16 = xF
214b0 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  unc(pStmt, col);
214c0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29  .  if( zName16 )
214d0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
214e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
214f0 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f   zName16;.    fo
21500 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a  r(n=0; z[n] || z
21510 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20  [n+1]; n+=2){}. 
21520 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
21530 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e  wByteArrayObj(zN
21540 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20  ame16, n+2);.   
21550 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
21560 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
21570 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
21580 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
21590 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   */..  return TC
215a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
215b0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
215c0 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f  lumn_int STMT co
215d0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
215e0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
215f0 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75  _bytes STMT colu
21600 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
21610 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
21620 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75  ytes16 STMT colu
21630 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  mn.**.*/.static 
21640 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
21650 49 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  I test_stmt_int(
21660 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21670 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
21680 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
21690 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
216a0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
216b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
216c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
216d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
216e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
216f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
21700 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
21710 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
21720 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
21730 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28    xFunc = (int (
21740 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
21750 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
21760 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
21770 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
21780 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
21790 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
217a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
217b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
217c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
217d0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
217e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
217f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
21800 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
21810 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21820 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21830 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
21840 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21850 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
21860 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
21870 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
21880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21890 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
218a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
218b0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
218c0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
218d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
218e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
218f0 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  :  sqlite_set_ma
21900 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e  gic  DB  MAGIC-N
21910 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20  UMBER.**.** Set 
21920 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61  the db->magic va
21930 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  lue.  This is us
21940 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  ed to test error
21950 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e   recovery logic.
21960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
21970 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c  QLITE_TCLAPI sql
21980 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20  ite_set_magic(. 
21990 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
219a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
219b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
219c0 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
219d0 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
219e0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
219f0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
21a00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21a10 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
21a20 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
21a30 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
21a40 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c      " DB MAGIC",
21a50 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
21a60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
21a70 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
21a80 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
21a90 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
21aa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
21ab0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
21ac0 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
21ad0 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OPEN")==0 ){.   
21ae0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
21af0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
21b00 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
21b10 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
21b20 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
21b30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
21b40 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
21b50 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
21b60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
21b70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
21b80 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d  E_MAGIC_BUSY")==
21b90 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
21ba0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
21bb0 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20  C_BUSY;.  }else 
21bc0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
21bd0 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
21be0 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a  C_ERROR")==0 ){.
21bf0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
21c00 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
21c10 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
21c20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
21c30 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74  p, argv[2], (int
21c40 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b  *)&db->magic) ){
21c50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
21c60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
21c70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
21c80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
21c90 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20  ite3_interrupt  
21ca0 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65  DB .**.** Trigge
21cb0 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f  r an interrupt o
21cc0 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n DB.*/.static i
21cd0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
21ce0 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28   test_interrupt(
21cf0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21d00 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
21d10 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
21d20 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
21d30 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
21d40 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
21d50 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
21d60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
21d70 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
21d80 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
21d90 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
21da0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
21db0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21dc0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
21dd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
21de0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
21df0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21e00 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
21e10 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  pt(db);.  return
21e20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21e30 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
21e40 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
21e50 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
21e60 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
21e70 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
21e80 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
21e90 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
21ea0 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
21eb0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
21ec0 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
21ed0 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
21ee0 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
21ef0 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
21f00 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
21f10 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
21f20 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
21f30 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
21f40 49 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  I delete_functio
21f50 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
21f60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
21f70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
21f80 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
21f90 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
21fa0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
21fb0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
21fc0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
21fd0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
21fe0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
21ff0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
22000 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
22010 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
22020 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
22030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22040 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22050 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22060 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
22070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22080 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22090 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
220a0 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
220b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
220c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  , 0, 0, 0);.  Tc
220d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
220e0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
220f0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
22100 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
22110 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22120 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22130 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
22140 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d  on DB collation-
22150 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  name.**.** Delet
22160 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
22170 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74  sequence 'collat
22180 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64  ion-name' from d
22190 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
221a0 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73 73  ** DB. It is ass
221b0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 6f  umed that the co
221c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
221d0 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
221e0 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61  UTF8 (the .** wa
221f0 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
22200 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
22210 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
22220 54 45 5f 54 43 4c 41 50 49 20 64 65 6c 65 74 65  TE_TCLAPI delete
22230 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f  _collation(.  vo
22240 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22250 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22260 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22270 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22280 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
22290 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
222a0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
222b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
222c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
222d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
222e0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
222f0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
22300 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20  function-name", 
22310 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
22320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22330 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
22340 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
22350 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
22360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
22370 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
22380 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61  _collation(db, a
22390 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55  rgv[2], SQLITE_U
223a0 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  TF8, 0, 0);.  Tc
223b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
223c0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
223d0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
223e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
223f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22400 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22410 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
22420 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t DB.**.** Retur
22430 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61  n true if the da
22440 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75 72  tabase DB is cur
22450 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63  rently in auto-c
22460 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52  ommit mode..** R
22470 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e  eturn false if n
22480 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
22490 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
224a0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a  get_autocommit(.
224b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
224c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
224d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
224e0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
224f0 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a  argv.){.  char z
22500 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74  Buf[30];.  sqlit
22510 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
22520 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
22530 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22540 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
22550 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22560 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
22570 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
22580 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22590 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
225a0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
225b0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
225c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
225d0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
225e0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
225f0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
22600 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
22610 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
22620 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
22630 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
22640 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
22650 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22660 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
22670 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
22680 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
22690 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
226a0 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
226b0 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
226c0 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
226d0 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
226e0 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
226f0 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
22700 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
22710 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
22720 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
22730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22740 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
22750 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  st_busy_timeout(
22760 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
22770 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
22780 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
22790 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
227a0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
227b0 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33  c, ms;.  sqlite3
227c0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
227d0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
227e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
227f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
22800 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
22810 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
22820 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
22830 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22840 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22850 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22860 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
22870 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22880 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
22890 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
228a0 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
228b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
228c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
228d0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
228e0 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   ms);.  Tcl_Appe
228f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22900 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
22910 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
22920 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
22930 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
22940 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
22950 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
22960 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
22970 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
22980 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
22990 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
229a0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
229b0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
229c0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
229d0 50 49 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  PI tcl_variable_
229e0 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
229f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
22a00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22a10 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
22a20 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22a30 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62  jv[].){.  Tcl_Ob
22a40 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f  j *pVar;.  if( o
22a50 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
22a60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
22a70 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
22a80 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20  "VARIABLE");.   
22a90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22aa0 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20  R;.  }.  pVar = 
22ab0 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
22ac0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22ad0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c  ing(objv[1]), 0,
22ae0 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d   TCL_LEAVE_ERR_M
22af0 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d  SG);.  if( pVar=
22b00 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
22b10 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61  ERROR;.  if( pVa
22b20 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20  r->typePtr ){.  
22b30 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22b40 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22b50 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72  ewStringObj(pVar
22b60 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c  ->typePtr->name,
22b70 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74   -1));.  }.  ret
22b80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22b90 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
22ba0 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
22bb0 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74  ory ?N?.**.** At
22bc0 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
22bd0 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
22be0 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61  y held but not a
22bf0 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  ctually required
22c00 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  ..** The integer
22c10 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
22c20 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72 65   of bytes we are
22c30 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61   trying to relea
22c40 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74  se.  The .** ret
22c50 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
22c60 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
22c70 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61  y actually relea
22c80 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
22c90 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
22ca0 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
22cb0 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  mory(.  void * c
22cc0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
22cd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22ce0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
22cf0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22d00 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69  jv[].){.#if defi
22d10 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
22d20 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
22d30 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  ENT) && !defined
22d40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
22d50 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20  KIO).  int N;.  
22d60 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
22d70 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
22d80 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
22d90 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
22da0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
22db0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22dc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22dd0 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
22de0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
22df0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
22e00 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
22e10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20  .  }else{.    N 
22e30 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  = -1;.  }.  amt 
22e40 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  = sqlite3_releas
22e50 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54  e_memory(N);.  T
22e60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
22e70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
22e80 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e  ntObj(amt));.#en
22e90 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
22ea0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
22eb0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
22ec0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
22ed0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70   DB.**.** Attemp
22ee0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
22ef0 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
22f00 6c 64 20 62 79 20 64 61 74 61 62 61 73 65 20 44  ld by database D
22f10 42 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  B.  Return the.*
22f20 2a 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77  * result code (w
22f30 68 69 63 68 20 69 6e 20 74 68 65 20 63 75 72 72  hich in the curr
22f40 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
22f50 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  on is always zer
22f60 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  o)..*/.static in
22f70 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
22f80 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f  test_db_release_
22f90 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a  memory(.  void *
22fa0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
22fb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22fc0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
22fd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22fe0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
22ff0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
23000 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  c;.  if( objc!=2
23010 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23020 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23030 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
23040 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23050 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23060 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23070 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23080 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23090 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
230a0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
230b0 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
230c0 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54  _memory(db);.  T
230d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
230e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
230f0 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  ntObj(rc));.  re
23100 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
23110 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
23120 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c  lite3_db_cachefl
23130 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74  ush DB.**.** Att
23140 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20 61 6e  empt to flush an
23150 79 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  y dirty pages to
23160 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
23170 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23180 50 49 20 74 65 73 74 5f 64 62 5f 63 61 63 68 65  PI test_db_cache
23190 66 6c 75 73 68 28 0a 20 20 76 6f 69 64 20 2a 20  flush(.  void * 
231a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
231b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
231c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
231d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
231e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
231f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
23200 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
23210 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
23220 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
23230 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
23240 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23250 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23260 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23270 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23280 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23290 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
232a0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
232b0 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
232c0 73 68 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  sh(db);.  if( rc
232d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
232e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
232f0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
23300 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  Str(rc), TCL_STA
23310 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
23320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23330 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
23340 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
23350 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
23360 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
23370 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
23380 6e 6f 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  no DB.**.** Retu
23390 72 6e 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  rn the low-level
233a0 20 73 79 73 74 65 6d 20 65 72 72 6e 6f 20 76 61   system errno va
233b0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
233c0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
233d0 20 74 65 73 74 5f 73 79 73 74 65 6d 5f 65 72 72   test_system_err
233e0 6e 6f 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  no(.  void * cli
233f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
23400 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
23410 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
23420 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
23430 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
23440 2a 64 62 3b 0a 20 20 69 6e 74 20 69 45 72 72 6e  *db;.  int iErrn
23450 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  o;.  if( objc!=2
23460 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23470 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23480 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
23490 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
234a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
234b0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
234c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
234d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
234e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
234f0 45 52 52 4f 52 3b 0a 20 20 69 45 72 72 6e 6f 20  ERROR;.  iErrno 
23500 3d 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d  = sqlite3_system
23510 5f 65 72 72 6e 6f 28 64 62 29 3b 0a 20 20 54 63  _errno(db);.  Tc
23520 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
23530 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
23540 74 4f 62 6a 28 69 45 72 72 6e 6f 29 29 3b 0a 20  tObj(iErrno));. 
23550 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23560 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
23570 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
23580 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a  name DB DBNAME.*
23590 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
235a0 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61  name of a file a
235b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
235c0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
235d0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
235e0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62 5f 66  TCLAPI test_db_f
235f0 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20  ilename(.  void 
23600 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
23610 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23620 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
23630 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
23640 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
23650 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
23660 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
23670 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
23680 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
23690 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
236a0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
236b0 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
236c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
236d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
236e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
236f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23700 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
23710 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
23720 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
23730 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
23740 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23750 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
23760 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64  e3_db_filename(d
23770 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f  b, zDbName), (vo
23780 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  id*)0);.  return
23790 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
237a0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
237b0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42  3_db_readonly DB
237c0 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65   DBNAME.**.** Re
237d0 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66 20 44  turn 1 or 0 if D
237e0 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c  BNAME is readonl
237f0 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75 72  y or not.  Retur
23800 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45 20 64  n -1 if DBNAME d
23810 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
23820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23830 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
23840 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a  st_db_readonly(.
23850 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
23860 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
23870 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
23880 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
23890 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
238a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
238b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
238c0 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
238d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
238e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
238f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
23900 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
23910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23920 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23930 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23940 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23950 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
23960 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23970 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
23980 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
23990 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74  v[2]);.  Tcl_Set
239a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
239b0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
239c0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
239d0 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  nly(db, zDbName)
239e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
239f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23a00 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f  age:  sqlite3_so
23a10 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e  ft_heap_limit ?N
23a20 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72  ?.**.** Query or
23a30 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   set the soft he
23a40 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65  ap limit for the
23a50 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
23a60 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69    The.** limit i
23a70 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
23a80 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65  f the N is prese
23a90 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75  nt.  The previou
23aa0 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65  s limit.** is re
23ab0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
23ac0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
23ad0 41 50 49 20 74 65 73 74 5f 73 6f 66 74 5f 68 65  API test_soft_he
23ae0 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64  ap_limit(.  void
23af0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
23b00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23b10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
23b20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23b30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
23b40 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d 74 3b  lite3_int64 amt;
23b50 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 4e  .  Tcl_WideInt N
23b60 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a   = -1;.  if( obj
23b70 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
23b80 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
23b90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
23ba0 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
23bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23bc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23bd0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
23be0 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
23bf0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
23c00 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29  , objv[1], &N) )
23c10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23c20 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  R;.  }.  amt = s
23c30 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
23c40 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54  _limit64(N);.  T
23c50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23c60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
23c70 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  ideIntObj(amt));
23c80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
23ca0 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  :   sqlite3_thre
23cb0 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a  ad_cleanup.**.**
23cc0 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
23cd0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
23ce0 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
23cf0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
23d00 49 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c  I test_thread_cl
23d10 65 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20  eanup(.  void * 
23d20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
23d30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
23d40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
23d50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23d60 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
23d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
23d80 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
23d90 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
23da0 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ();.#endif.  ret
23db0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
23dc0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
23dd0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
23de0 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20  ounts  DB.**.** 
23df0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
23e00 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
23e10 72 65 20 74 68 65 20 50 61 67 65 72 52 65 66 63  re the PagerRefc
23e20 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20  ount for all.** 
23e30 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20 64  pagers on each d
23e40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
23e50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
23e60 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
23e70 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f  test_pager_refco
23e80 75 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  unts(.  void * c
23e90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
23ea0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23eb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
23ec0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23ed0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
23ee0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  3 *db;.  int i;.
23ef0 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54    int v, *a;.  T
23f00 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
23f10 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
23f20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23f30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23f40 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23f50 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
23f60 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
23f70 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
23f80 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
23f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
23fa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
23fb0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
23fc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
23fd0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
23fe0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
23ff0 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75  L_ERROR;.  pResu
24000 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  lt = Tcl_NewObj(
24010 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
24020 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
24030 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
24040 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ].pBt==0 ){.    
24050 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    v = -1;.    }e
24060 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24070 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
24080 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
24090 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   a = sqlite3Page
240a0 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74  rStats(sqlite3Bt
240b0 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
240c0 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20  [i].pBt));.     
240d0 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20   v = a[0];.     
240e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
240f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
24100 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
24110 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
24120 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20  ent(0, pResult, 
24130 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
24140 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
24150 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24160 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  , pResult);.  re
24170 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
24180 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24190 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
241a0 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43  nt.**.** Some TC
241b0 4c 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79  L builds (ex: cy
241c0 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70  gwin) do not sup
241d0 70 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65  port 64-bit inte
241e0 67 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c  gers.  This.** l
241f0 65 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72  eads to a number
24200 20 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65   of test failure
24210 73 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20  s.  The present 
24220 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74  command checks t
24230 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20  he.** TCL build 
24240 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
24250 72 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74  r not it support
24260 73 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  s 64-bit integer
24270 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  s.  It.** return
24280 73 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65  s TRUE if it doe
24290 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
242a0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ot..**.** This c
242b0 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
242c0 6f 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61  o warn users tha
242d0 74 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c  t their TCL buil
242e0 64 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a  d is defective.*
242f0 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65  * and that the e
24300 72 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73  rrors they are s
24310 65 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73  eeing in the tes
24320 74 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20  t scripts might 
24330 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f  be.** a result o
24340 66 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76  f their defectiv
24350 65 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61  e TCL rather tha
24360 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51  n problems in SQ
24370 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Lite..*/.static 
24380 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
24390 49 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f  I working_64bit_
243a0 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
243b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
243c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
243d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
243e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
243f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24400 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24410 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24420 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24430 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
24440 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
24450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
24460 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
24470 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24480 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24490 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
244a0 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f   Tcl_Obj *pTestO
244b0 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e  bj;.  int workin
244c0 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f  g = 0;..  pTestO
244d0 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  bj = Tcl_NewWide
244e0 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28  IntObj(1000000*(
244f0 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b  i64)1234567890);
24500 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72  .  working = str
24510 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
24520 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32  g(pTestObj), "12
24530 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29  34567890000000")
24540 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  ==0;.  Tcl_DecrR
24550 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a  efCount(pTestObj
24560 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
24570 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
24580 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
24590 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74  working));.  ret
245a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
245b0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
245c0 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a  vfs_unlink_test.
245d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
245e0 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65  ommand unregiste
245f0 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56  rs the primary V
24600 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69  FS and then regi
24610 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b  sters.** it back
24620 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73   again.  This is
24630 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
24640 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67  e ability to reg
24650 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77  ister a.** VFS w
24660 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65  hen none are pre
24670 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
24680 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c  ed, and the abil
24690 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67  ity to .** unreg
246a0 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61  ister the only a
246b0 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54  vailable VFS.  T
246c0 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73  icket #2738.*/.s
246d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
246e0 5f 54 43 4c 41 50 49 20 76 66 73 5f 75 6e 6c 69  _TCLAPI vfs_unli
246f0 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nk_test(.  Clien
24700 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
24710 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24720 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24730 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24740 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24750 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
24760 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24770 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
24780 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
24790 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
247a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
247b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
247c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
247d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
247e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
247f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
24800 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e  lite3_vfs *pMain
24810 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
24820 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71  *apVfs[20];.  sq
24830 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74  lite3_vfs one, t
24840 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  wo;..  sqlite3_v
24850 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29  fs_unregister(0)
24860 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ;   /* Unregiste
24870 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72  r of NULL is har
24880 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a  mless */.  one.z
24890 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
248a0 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f    two.zName = "_
248b0 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c  _two";..  /* Cal
248c0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ling sqlite3_vfs
248d0 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32  _register with 2
248e0 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30  nd argument of 0
248f0 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63   does not.  ** c
24900 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
24910 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61  t VFS.  */.  pMa
24920 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  in = sqlite3_vfs
24930 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69  _find(0);.  sqli
24940 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
24950 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73  (&one, 0);.  ass
24960 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
24970 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
24980 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
24990 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
249a0 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a  ister(&two, 0);.
249b0 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
249c0 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
249d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
249e0 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e   );..  /* We can
249f0 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69   find a VFS by i
24a00 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73  ts name */.  ass
24a10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
24a20 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
24a30 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
24a40 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
24a50 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
24a60 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  o );..  /* Calli
24a70 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65  ng sqlite_vfs_re
24a80 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d  gister with non-
24a90 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61  zero second para
24aa0 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68  meter changes th
24ab0 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56  e.  ** default V
24ac0 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  FS, even if the 
24ad0 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  1st parameter is
24ae0 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20   an existig VFS 
24af0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65  that is.  ** pre
24b00 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
24b10 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65  ed as the non-de
24b20 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  fault..  */.  sq
24b30 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
24b40 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61  er(&one, 1);.  a
24b50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
24b60 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
24b70 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
24b80 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
24b90 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
24ba0 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
24bb0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
24bc0 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  d(0)==&one );.  
24bd0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
24be0 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20  ster(&two, 1);. 
24bf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24c00 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
24c10 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
24c20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
24c30 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
24c40 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72  =&two );.  asser
24c50 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
24c60 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a  ind(0)==&two );.
24c70 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20    if( pMain ){. 
24c80 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
24c90 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31  egister(pMain, 1
24ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
24cb0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
24cc0 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
24cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
24ce0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
24cf0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
24d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
24d10 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
24d20 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20  ==pMain );.  }. 
24d30 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68   .  /* Unlink th
24d40 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20  e default VFS.  
24d50 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
24d60 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56  re are no more V
24d70 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74  FSes.  ** regist
24d80 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ered..  */.  for
24d90 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
24da0 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
24db0 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  fs[0]); i++){.  
24dc0 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
24dd0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
24de0 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
24df0 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i] ){.      asse
24e00 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
24e10 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61  lite3_vfs_find(a
24e20 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20  pVfs[i]->zName) 
24e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24e40 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
24e50 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20  apVfs[i]);.     
24e60 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
24e70 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
24e80 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
24e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
24ea0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
24eb0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
24ec0 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20   .  /* Register 
24ed0 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20  the main VFS as 
24ee0 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c  non-default (wil
24ef0 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c  l be made defaul
24f00 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74  t, since.  ** it
24f10 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  'll be the only 
24f20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65  one in existence
24f30 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
24f40 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
24f50 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65  Main, 0);.  asse
24f60 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
24f70 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
24f80 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67  ;.  .  /* Un-reg
24f90 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56  ister the main V
24fa0 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74  FS again to rest
24fb0 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53  ore an empty VFS
24fc0 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74   list */.  sqlit
24fd0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
24fe0 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65  r(pMain);.  asse
24ff0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
25000 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
25010 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56   /* Relink all V
25020 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  FSes in reverse 
25030 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f  order. */  .  fo
25040 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73  r(i=sizeof(apVfs
25050 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
25060 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ])-1; i>=0; i--)
25070 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  {.    if( apVfs[
25080 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i] ){.      sqli
25090 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
250a0 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20  (apVfs[i], 1);. 
250b0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
250c0 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
250d0 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
250e0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
250f0 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
25100 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
25110 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
25120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  .  }..  /* Unreg
25130 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65  ister out sample
25140 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c   VFSes. */.  sql
25150 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
25160 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c  ter(&one);.  sql
25170 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
25180 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a  ter(&two);..  /*
25190 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61   Unregistering a
251a0 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74   VFS that is not
251b0 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
251c0 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73  tered is harmles
251d0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
251e0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
251f0 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
25200 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
25210 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  wo);.  assert( s
25220 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
25230 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20  "__one")==0 );. 
25240 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25250 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
25260 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ")==0 );..  /* W
25270 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74  e should be left
25280 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e   with the origin
25290 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62  al default VFS b
252a0 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ack as the.  ** 
252b0 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73  original */.  as
252c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
252d0 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e  s_find(0)==pMain
252e0 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
252f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
25300 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69  clcmd:   vfs_ini
25310 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  tfail_test.**.**
25320 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
25330 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66  d attempts to vf
25340 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72  s_find and vfs_r
25350 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65  egister when the
25360 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  .** sqlite3_init
25370 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61  ialize() interfa
25380 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20  ce is failing.  
25390 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64  All calls should
253a0 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   fail..*/.static
253b0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
253c0 50 49 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  PI vfs_initfail_
253d0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
253e0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
253f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25400 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25410 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25420 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25430 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25440 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25450 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25460 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
25470 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
25480 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25490 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
254a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
254b0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
254c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
254d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
254e0 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  e;.  one.zName =
254f0 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28   "__one";..  if(
25500 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25510 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
25520 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
25530 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
25540 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  &one, 0);.  if( 
25550 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25560 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
25570 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
25580 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
25590 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  one, 1);.  if( s
255a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
255b0 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
255c0 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
255d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
255e0 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a   Saved VFSes.*/.
255f0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
25600 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73  fs *apVfs[20];.s
25610 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d  tatic int nVfs =
25620 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   0;../*.** tclcm
25630 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73  d:   vfs_unregis
25640 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e  ter_all.**.** Un
25650 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  register all VFS
25660 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
25670 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
25680 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
25690 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
256a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
256b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
256c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
256d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
256e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
256f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25700 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25710 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
25720 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
25730 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
25740 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25750 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25760 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25770 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25780 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25790 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
257a0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70  ; i<ArraySize(ap
257b0 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Vfs); i++){.    
257c0 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
257d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
257e0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
257f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25800 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
25810 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
25820 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20  );.  }.  nVfs = 
25830 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  i;.  return TCL_
25840 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
25850 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69  md:   vfs_reregi
25860 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52  ster_all.**.** R
25870 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73  estore all VFSes
25880 20 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76   that were remov
25890 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72  ed using vfs_unr
258a0 65 67 69 73 74 65 72 5f 61 6c 6c 2e 20 54 61 6b  egister_all. Tak
258b0 69 6e 67 0a 2a 2a 20 63 61 72 65 20 74 6f 20 70  ing.** care to p
258c0 75 74 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  ut the linked li
258d0 73 74 20 62 61 63 6b 20 74 6f 67 65 74 68 65 72  st back together
258e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
258f0 65 72 20 61 73 20 69 74 20 77 61 73 0a 2a 2a 20  er as it was.** 
25900 69 6e 20 62 65 66 6f 72 65 20 76 66 73 5f 75 6e  in before vfs_un
25910 72 65 67 69 73 74 65 72 5f 61 6c 6c 20 77 61 73  register_all was
25920 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
25930 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
25940 43 4c 41 50 49 20 76 66 73 5f 72 65 72 65 67 69  CLAPI vfs_reregi
25950 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65  ster_all(.  Clie
25960 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25970 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25980 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25990 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
259a0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
259b0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
259c0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
259d0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
259e0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
259f0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25a00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25a10 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25a20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25a30 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25a40 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25a50 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
25a60 6f 72 28 69 3d 6e 56 66 73 2d 31 3b 20 69 3e 3d  or(i=nVfs-1; i>=
25a70 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 73 71 6c  0; i--){.    sql
25a80 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
25a90 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
25aa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
25ab0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
25ac0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
25ad0 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a  ntrol_test DB.**
25ae0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
25af0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
25b00 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
25b10 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
25b20 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
25b30 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
25b40 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73  f the same..*/.s
25b50 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
25b60 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
25b70 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  trol_test(.  Cli
25b80 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
25b90 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
25ba0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
25bb0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
25bc0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25bd0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
25be0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
25bf0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
25c00 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
25c10 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
25c20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25c30 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
25c40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
25c50 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
25c60 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
25c70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
25c80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
25c90 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
25ca0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
25cb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25cc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25cd0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
25ce0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
25cf0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
25d00 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
25d10 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
25d20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25d30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25d40 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
25d50 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
25d60 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
25d70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
25d80 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
25d90 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25da0 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72  l(db, 0, 0, &iAr
25db0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
25dc0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
25dd0 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  D );.  rc = sqli
25de0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25df0 28 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61  (db, "notadataba
25e00 73 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  se", SQLITE_FCNT
25e10 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41  L_LOCKSTATE, &iA
25e20 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
25e30 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
25e40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
25e50 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
25e60 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26  b, "main", -1, &
25e70 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
25e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
25e90 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73  OUND );.  rc = s
25ea0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
25eb0 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20  rol(db, "temp", 
25ec0 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  -1, &iArg);.  as
25ed0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
25ee0 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d  _NOTFOUND || rc=
25ef0 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b  =SQLITE_ERROR );
25f00 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
25f10 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
25f20 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
25f30 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
25f40 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
25f50 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
25f60 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
25f70 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
25f80 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
25f90 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
25fa0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
25fb0 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20  LITE_LAST_ERRNO 
25fc0 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  verb..*/.static 
25fd0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
25fe0 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  I file_control_l
25ff0 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20  asterrno_test(. 
26000 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26010 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26020 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26030 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26040 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26050 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26060 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26070 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26080 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26090 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
260a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
260b0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
260c0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
260d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
260e0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
260f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
26100 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
26110 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
26120 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
26130 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
26140 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
26150 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
26160 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
26170 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
26180 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
26190 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
261a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
261b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
261c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
261d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
261e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
261f0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
26200 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26210 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
26220 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26230 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
26240 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72  LAST_ERRNO, &iAr
26250 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20  g);.  if( rc ){ 
26260 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
26270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
26280 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
26290 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ; .    return TC
262a0 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20  L_ERROR; .  }.  
262b0 69 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a  if( iArg!=0 ) {.
262c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
262d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e  sult(interp, "Un
262e0 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72  expected non-zer
262f0 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20  o errno: ",.    
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
26320 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74  omObj(Tcl_NewInt
26330 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22  Obj(iArg), 0), "
26340 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   ", 0);.    retu
26350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26360 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
26370 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
26380 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
26390 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
263a0 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49  est DB DBNAME SI
263b0 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  ZE.**.** This TC
263c0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
263d0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
263e0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
263f0 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
26400 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
26410 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
26420 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
26430 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ILE and.** SQLIT
26440 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
26450 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74  ILE verbs..*/.st
26460 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
26470 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
26480 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
26490 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
264a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
264b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
264c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
264d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
264e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
264f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26500 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26510 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26520 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26530 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26550 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26560 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26570 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26580 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26590 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265b0 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a  /* New chunk siz
265c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
265d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
265e0 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
265f0 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
26600 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
26610 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26630 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
26640 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
26670 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
26680 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  de */..  if( obj
26690 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
266a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
266b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
266c0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b  B DBNAME SIZE");
266d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
266e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
266f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
26700 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
26710 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
26720 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  b) .   || Tcl_Ge
26730 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
26740 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  rp, objv[3], &nS
26750 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74  ize).  ){.   ret
26760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26770 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47   }.  zDb = Tcl_G
26780 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
26790 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d  );.  if( zDb[0]=
267a0 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55  ='\0' ) zDb = NU
267b0 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  LL;..  rc = sqli
267c0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
267d0 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
267e0 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
267f0 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a  E, (void *)&nSiz
26800 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
26810 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
26820 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
26830 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  *)sqlite3ErrName
26840 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
26850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26860 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
26870 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26880 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26890 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
268a0 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44  zehint_test DB D
268b0 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
268c0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
268d0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
268e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
268f0 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69  interface .** wi
26900 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  th SQLITE_FCNTL_
26910 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61  SIZE_HINT.*/.sta
26920 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
26930 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72  CLAPI file_contr
26940 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
26950 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26960 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26970 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26980 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26990 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
269a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
269b0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
269c0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
269d0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
269e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a00 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26a10 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26a20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26a30 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26a40 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
26a50 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b  l_WideInt nSize;
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a70 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a   Hinted size */.
26a80 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d    /* Db name ("m
26ab0 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63  ain", "temp" etc
26ac0 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  .) */.  sqlite3 
26ad0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
26ae0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
26af0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
26b00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  /* file_control(
26b30 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  ) return code */
26b40 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
26b50 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
26b60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
26b70 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
26b80 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20  AME SIZE");.    
26b90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26ba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26bb0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26bc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26bd0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20  bjv[1]), &db) . 
26be0 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65    || Tcl_GetWide
26bf0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
26c00 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69  p, objv[3], &nSi
26c10 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75  ze).  ){.   retu
26c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26c30 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
26c40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
26c50 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d  ;.  if( zDb[0]==
26c60 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c  '\0' ) zDb = NUL
26c70 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  L;..  rc = sqlit
26c80 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
26c90 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
26ca0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
26cb0 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29   (void *)&nSize)
26cc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
26cd0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
26ce0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
26cf0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
26d00 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
26d10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
26d20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
26d30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
26d40 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
26d50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
26d60 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57  proxy_test DB PW
26d70 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  D.**.** This TCL
26d80 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
26d90 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
26da0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
26db0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
26dc0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
26dd0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
26de0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
26df0 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
26e00 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
26e10 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
26e20 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
26e30 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72  CLAPI file_contr
26e40 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
26e50 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
26e60 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
26e70 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
26e80 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
26e90 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
26ea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
26eb0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
26ec0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
26ed0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
26ee0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
26ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26f00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
26f10 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
26f20 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
26f30 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
26f40 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
26f50 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20  qlite3 *db;.  . 
26f60 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
26f70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
26f80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
26f90 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
26fa0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
26fd0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
26fe0 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30 29 3b  , " DB PWD", 0);
26ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27000 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27010 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27020 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27030 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27040 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  b) ){.   return 
27050 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27060 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
27070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27080 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69  KING_STYLE).#  i
27090 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
270a0 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65  E__).#    define
270b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
270c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23  OCKING_STYLE 1.#
270d0 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
270e0 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
270f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30  _LOCKING_STYLE 0
27100 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
27110 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
27120 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
27130 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
27140 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63  PLE__).  {.    c
27150 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a 20  har *testPath;. 
27160 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
27170 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e  nt nPwd;.    con
27180 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20  st char *zPwd;. 
27190 20 20 20 63 68 61 72 20 70 72 6f 78 79 50 61 74     char proxyPat
271a0 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20  h[400];.    .   
271b0 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74 53   zPwd = Tcl_GetS
271c0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
271d0 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20  v[2], &nPwd);.  
271e0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72 6f    if( sizeof(pro
271f0 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30 20  xyPath)<nPwd+20 
27200 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
27210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27220 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22 2c  , "PWD too big",
27230 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20   (void*)0);.    
27240 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27250 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
27260 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
27270 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29  izeof(proxyPath)
27280 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 22 25 73  , proxyPath, "%s
27290 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50  /test.proxy", zP
272a0 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  wd);.    rc = sq
272b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
272c0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
272d0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
272e0 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
272f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
27300 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
27310 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
27320 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
27330 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  )); .      retur
27340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
27350 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
27360 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
27370 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
27380 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
27390 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b  ILE, &testPath);
273a0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
273b0 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50  (proxyPath,testP
273c0 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20  ath,11) ){.     
273d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
273e0 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20  t(interp, "Lock 
273f0 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e  proxy file did n
27400 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20  ot match the ". 
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
27430 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e  reviously assign
27440 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  ed value", 0);. 
27450 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
27460 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27470 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27480 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27490 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
274a0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
274b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
274c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
274d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
274e0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
274f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
27500 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
27510 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
27520 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
27530 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
27540 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
27550 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
27560 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27570 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
27580 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
27590 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53 51  _OK;  .}..#if SQ
275a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
275b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
275c0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
275d0 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45 54  v_retry DB  NRET
275e0 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20  RY  DELAY.**.** 
275f0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
27600 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
27610 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
27620 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
27630 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
27640 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
27650 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
27660 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
27670 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
27680 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
27690 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
276a0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
276b0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
276c0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
276d0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
276e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
276f0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27700 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27710 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27720 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27740 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
27750 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
27760 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
27770 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
27780 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
27790 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
277a0 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32 5d 3b   rc;.  int a[2];
277b0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
277c0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
277d0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
277e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
277f0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
27800 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
27810 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
27820 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
27830 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52 45 54  ], 0), " DB NRET
27840 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b 0a 20  RY DELAY", 0);. 
27850 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27860 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
27870 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27880 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
27890 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
278a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
278b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
278c0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
278d0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
278e0 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20 29 20  jv[2], &a[0]) ) 
278f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27900 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
27910 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
27920 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d  , objv[3], &a[1]
27930 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
27940 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
27950 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27960 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
27970 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
27980 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64 2a 29  V_RETRY, (void*)
27990 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  a);.  sqlite3_sn
279a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
279b0 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64 22 2c  , z, "%d %d %d",
279c0 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29   rc, a[0], a[1])
279d0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
279e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
279f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
27a00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
27a10 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27a20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
27a30 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 20 44  n32_get_handle D
27a40 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
27a50 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
27a60 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
27a70 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
27a80 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
27a90 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
27aa0 47 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64  GET_HANDLE opcod
27ab0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27ac0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
27ad0 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_get_handle(.
27ae0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27af0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
27b00 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
27b10 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27b20 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
27b30 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
27b40 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
27b50 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
27b60 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
27b70 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
27b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27b90 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27ba0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27bb0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
27bc0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
27bd0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
27be0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
27bf0 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
27c00 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
27c10 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
27c20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
27c30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
27c40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
27c50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
27c60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
27c70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
27c80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
27c90 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
27ca0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27cb0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
27cc0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
27cd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27ce0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
27cf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27d00 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
27d10 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
27d20 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
27d30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
27d40 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 2c 0a 20  32_GET_HANDLE,. 
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
27d70 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71 6c  *)&hFile);.  sql
27d80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
27d90 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
27da0 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a 29  %p", rc, (void*)
27db0 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41 70  hFile);.  Tcl_Ap
27dc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
27dd0 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
27de0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
27df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
27e00 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
27e10 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64  l_win32_set_hand
27e20 6c 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a  le DB HANDLE.**.
27e30 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
27e40 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
27e50 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27e60 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
27e70 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
27e80 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48  CNTL_WIN32_SET_H
27e90 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f  ANDLE opcode..*/
27ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
27eb0 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63  TE_TCLAPI file_c
27ec0 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
27ed0 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e  _handle(.  Clien
27ee0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
27ef0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
27f00 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
27f10 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
27f20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
27f30 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
27f40 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
27f50 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
27f60 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
27f70 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
27f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27f90 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
27fa0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27fb0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27fc0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27fd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
27fe0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41  ;.  int rc;.  HA
27ff0 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c  NDLE hFile = NUL
28000 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  L;.  char z[100]
28010 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
28020 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
28030 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28040 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
28050 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
28060 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
28070 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
28080 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48 41  [0], 0), " DB HA
28090 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NDLE", 0);.    r
280a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
280b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
280c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
280d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
280e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
280f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28100 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28110 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28 69  getWin32Handle(i
28120 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
28130 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
28140 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  hFile) ){.    re
28150 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28160 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
28170 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
28180 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
28190 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
281a0 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20  _HANDLE,.       
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69       (void*)&hFi
281d0 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  le);.  sqlite3_s
281e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
281f0 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72  ), z, "%d %p", r
28200 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29  c, (void*)hFile)
28210 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
28220 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
28230 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
28240 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
28250 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
28260 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
28270 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
28280 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47   DB PERSIST-FLAG
28290 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
282a0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
282b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
282c0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
282d0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
282e0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
282f0 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  _WAL opcode..*/.
28300 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
28310 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
28320 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
28330 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
28340 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
28350 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
28360 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
28370 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
28380 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
28390 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
283a0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
283b0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
283c0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
283d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
283e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
283f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
28400 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
28410 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
28420 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
28430 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
28440 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50 65 72  t rc;.  int bPer
28450 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a 5b 31  sist;.  char z[1
28460 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
28470 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28480 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28490 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
284a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
284b0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
284c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
284d0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
284e0 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20   FLAG", 0);.    
284f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28500 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
28510 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
28520 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28530 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
28540 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28550 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28560 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28570 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28580 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29 20 29  2], &bPersist) )
28590 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
285a0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
285b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
285c0 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
285d0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
285e0 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65 72 73  L, (void*)&bPers
285f0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ist);.  sqlite3_
28600 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
28610 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20  z), z, "%d %d", 
28620 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b 0a 20  rc, bPersist);. 
28630 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
28640 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
28650 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
28660 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
28670 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
28680 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
28690 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 20 44  safe_overwrite D
286a0 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a  B PSOW-FLAG.**.*
286b0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
286c0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
286d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
286e0 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
286f0 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
28700 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
28710 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65 2e 0a  ERWRITE opcode..
28720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
28730 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
28740 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
28750 66 65 5f 6f 76 65 72 77 72 69 74 65 28 0a 20 20  fe_overwrite(.  
28760 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28770 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28780 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
28790 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
287a0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
287b0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
287c0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
287d0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
287e0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
287f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28810 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28820 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28830 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28840 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28850 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28860 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
28870 0a 20 20 69 6e 74 20 62 3b 0a 20 20 63 68 61 72  .  int b;.  char
28880 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
28890 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
288a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
288b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
288c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
288d0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
288e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
288f0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
28900 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a  " DB FLAG", 0);.
28910 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28920 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28930 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
28940 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
28950 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
28960 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28970 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
28980 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
28990 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
289a0 62 6a 76 5b 32 5d 2c 20 26 62 29 20 29 20 72 65  bjv[2], &b) ) re
289b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
289c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
289d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e  ile_control(db,N
289e0 55 4c 4c 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ULL,SQLITE_FCNTL
289f0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
28a00 52 49 54 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b  RITE,(void*)&b);
28a10 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
28a20 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
28a30 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
28a40 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
28a50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
28a60 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
28a70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
28a80 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
28a90 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
28aa0 76 66 73 6e 61 6d 65 20 44 42 20 3f 41 55 58 44  vfsname DB ?AUXD
28ab0 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  B?.**.** Return 
28ac0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
28ad0 73 63 72 69 62 65 73 20 74 68 65 20 73 74 61 63  scribes the stac
28ae0 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73  k of VFSes..*/.s
28af0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
28b00 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
28b10 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20  trol_vfsname(.  
28b20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28b30 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28b40 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
28b50 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
28b60 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
28b70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
28b80 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
28b90 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
28ba0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
28bb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28bd0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28be0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28bf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28c00 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28c10 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28c20 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
28c30 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
28c40 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
28c50 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  VfsName = 0;..  
28c60 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
28c70 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
28c80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28c90 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
28ca0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
28cb0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
28cc0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
28cd0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
28ce0 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29   DB ?AUXDB?", 0)
28cf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
28d00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
28d10 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28d20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
28d30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
28d40 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
28d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28d60 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
28d70 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20  {.    zDbName = 
28d80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
28d90 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  jv[2]);.  }.  sq
28da0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
28db0 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ol(db, zDbName, 
28dc0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
28dd0 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66  NAME,(void*)&zVf
28de0 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70  sName);.  Tcl_Ap
28df0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28e00 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68  p, zVfsName, (ch
28e10 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
28e20 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29  3_free(zVfsName)
28e30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
28e40 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
28e50 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
28e60 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
28e70 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a  e DB ?AUXDB?.**.
28e80 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
28e90 6e 67 20 74 68 61 74 20 69 73 20 61 20 74 65 6d  ng that is a tem
28ea0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a  porary filename.
28eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
28ec0 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
28ed0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
28ee0 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44  ename(.  ClientD
28ef0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
28f00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
28f10 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
28f20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
28f30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
28f40 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
28f50 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
28f60 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
28f70 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
28f80 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
28f90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28fa0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
28fb0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28fc0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
28fd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
28fe0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
28ff0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29000 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  bName = "main";.
29010 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
29020 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
29030 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
29040 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
29050 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
29060 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
29070 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
29080 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
29090 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
290a0 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44  , 0), " DB ?AUXD
290b0 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  B?", 0);.    ret
290c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
290d0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
290e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
290f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29100 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
29110 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29120 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
29130 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
29140 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
29150 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
29160 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   }.  sqlite3_fil
29170 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
29180 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
29190 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
291a0 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65  , (void*)&zTName
291b0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
291c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54  esult(interp, zT
291d0 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
291e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
291f0 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  zTName);.  retur
29200 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a  n TCL_OK;  .}...
29210 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
29220 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
29230 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20  .**.**   Return 
29240 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61  a tcl list conta
29250 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ining the names 
29260 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65  of all registere
29270 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74  d vfs's..*/.stat
29280 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
29290 4c 41 50 49 20 76 66 73 5f 6c 69 73 74 28 0a 20  LAPI vfs_list(. 
292a0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
292b0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
292c0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
292d0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
292e0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
292f0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
29300 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
29310 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
29320 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
29330 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
29340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29350 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
29360 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
29370 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
29380 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
29390 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
293a0 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
293b0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
293c0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
293d0 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
293e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
293f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
29400 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
29410 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29420 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73    }.  for(pVfs=s
29430 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
29440 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70  0); pVfs; pVfs=p
29450 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Vfs->pNext){.   
29460 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
29470 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
29480 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
29490 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a  tringObj(pVfs->z
294a0 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  Name, -1));.  }.
294b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
294c0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
294d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
294e0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
294f0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
29500 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55  limit DB ID VALU
29510 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
29520 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
29530 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20  e sqlite3_limit 
29540 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
29550 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
29560 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
29570 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
29580 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
29590 4c 41 50 49 20 74 65 73 74 5f 6c 69 6d 69 74 28  LAPI test_limit(
295a0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
295b0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
295c0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
295d0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
295e0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
295f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
29600 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29610 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
29620 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
29630 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29650 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
29660 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
29670 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
29680 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
29690 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
296a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
296b0 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  rc;.  static con
296c0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
296d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
296e0 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61     int id;.  } a
296f0 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  Id[] = {.    { "
29700 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
29710 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  GTH",           
29720 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
29730 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
29740 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
29750 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
29760 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
29770 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53    SQLITE_LIMIT_S
29780 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  QL_LENGTH       
29790 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
297a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
297b0 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
297c0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
297d0 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20  LUMN            
297e0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
297f0 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
29800 45 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  EPTH",          
29810 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
29820 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20  R_DEPTH         
29830 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
29840 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
29850 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53  D_SELECT",     S
29860 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
29870 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20  OUND_SELECT     
29880 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
29890 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22  E_LIMIT_VDBE_OP"
298a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
298b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
298c0 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OP              
298d0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
298e0 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
298f0 41 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ARG",        SQL
29900 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
29910 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d  ON_ARG         }
29920 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
29930 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c  LIMIT_ATTACHED",
29940 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
29950 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
29960 44 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  D             },
29970 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
29980 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
29990 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54  N_LENGTH", SQLIT
299a0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
299b0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a  TERN_LENGTH  },.
299c0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
299d0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
299e0 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45  BER",     SQLITE
299f0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
29a00 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20  NUMBER      },. 
29a10 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
29a20 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
29a30 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
29a40 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
29a50 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  PTH        },.  
29a60 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
29a70 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
29a80 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ",      SQLITE_L
29a90 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
29aa0 41 44 53 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ADS       },.   
29ab0 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20   .    /* Out of 
29ac0 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73  range test cases
29ad0 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   */.    { "SQLIT
29ae0 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c  E_LIMIT_TOOSMALL
29af0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  ",            -1
29b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
29b30 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20  _LIMIT_TOOBIG", 
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
29b50 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
29b60 5f 54 48 52 45 41 44 53 2b 31 20 20 20 20 20 7d  _THREADS+1     }
29b70 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
29b80 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 76 61  id = 0;.  int va
29b90 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
29ba0 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  *zId;..  if( obj
29bb0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
29bc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29bd0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
29be0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
29bf0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
29c00 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
29c10 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
29c20 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b  B ID VALUE", 0);
29c30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29c40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
29c50 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
29c60 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
29c70 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
29c80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
29c90 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54  ERROR;.  zId = T
29ca0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
29cb0 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
29cc0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f  ; i<sizeof(aId)/
29cd0 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20  sizeof(aId[0]); 
29ce0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
29cf0 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d  rcmp(zId, aId[i]
29d00 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
29d10 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e      id = aId[i].
29d20 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  id;.      break;
29d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
29d40 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f   i>=sizeof(aId)/
29d50 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29  sizeof(aId[0]) )
29d60 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
29d70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
29d80 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79  unknown limit ty
29d90 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61  pe: ", zId, (cha
29da0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
29db0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29dc0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
29dd0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
29de0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
29df0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
29e00 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
29e10 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c  e3_limit(db, id,
29e20 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   val);.  Tcl_Set
29e30 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
29e40 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
29e50 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
29e60 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
29e70 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f  * tclcmd:  save_
29e80 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a  prng_state.**.**
29e90 20 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20   Save the state 
29ea0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61  of the pseudo-ra
29eb0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
29ec0 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65  rator..** At the
29ed0 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69   same time, veri
29ee0 66 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  fy that sqlite3_
29ef0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72  test_control wor
29f00 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  ks even when.** 
29f10 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f  called with an o
29f20 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f  ut-of-range opco
29f30 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
29f40 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
29f50 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  save_prng_state(
29f60 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
29f70 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
29f80 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
29f90 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
29fa0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
29fb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
29fc0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29fd0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
29fe0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
29ff0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a010 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2a020 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2a030 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2a040 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2a050 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
2a060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
2a070 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29  st_control(9999)
2a080 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
2a090 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2a0a0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2a0b0 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (-1);.  assert( 
2a0c0 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  rc==0 );.  sqlit
2a0d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2a0e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2a0f0 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65  PRNG_SAVE);.  re
2a100 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
2a110 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
2a120 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
2a130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2a140 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65 73  QLITE_TCLAPI res
2a150 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  tore_prng_state(
2a160 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2a170 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
2a180 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
2a190 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
2a1a0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
2a1b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2a1c0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2a1d0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2a1e0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2a1f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a210 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2a220 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2a230 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2a240 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2a250 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
2a260 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2a270 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2a280 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b  L_PRNG_RESTORE);
2a290 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a2a0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
2a2b0 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  :  reset_prng_st
2a2c0 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
2a2d0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2a2e0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
2a2f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2a300 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
2a310 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
2a320 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
2a330 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
2a340 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2a350 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2a360 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2a370 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2a380 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2a3b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2a3c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2a3d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2a3e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
2a3f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2a400 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2a410 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a  RL_PRNG_RESET);.
2a420 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
2a440 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f  :  database_may_
2a450 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a  be_corrupt.**.**
2a460 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 64   Indicate that d
2a470 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
2a480 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ght be corrupt. 
2a490 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2a4a0 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c 0a   set the normal.
2a4b0 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65 72  ** state of oper
2a4c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
2a4d0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2a4e0 50 49 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f  PI database_may_
2a4f0 62 65 5f 63 6f 72 72 75 70 74 28 0a 20 20 43 6c  be_corrupt(.  Cl
2a500 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2a510 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
2a520 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
2a530 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
2a540 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2a550 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2a560 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2a570 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2a580 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2a590 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2a5a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a5b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2a5c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2a5d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2a5e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2a5f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
2a600 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2a610 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
2a620 45 52 5f 43 4f 52 52 55 50 54 2c 20 30 29 3b 0a  ER_CORRUPT, 0);.
2a630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a640 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
2a650 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72    database_never
2a660 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49  _corrupt.**.** I
2a670 6e 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74  ndicate that dat
2a680 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
2a690 61 6c 77 61 79 73 20 77 65 6c 6c 2d 66 6f 72 6d  always well-form
2a6a0 65 64 2e 20 20 54 68 69 73 20 65 6e 61 62 6c 65  ed.  This enable
2a6b0 73 20 65 78 74 72 61 20 61 73 73 65 72 74 28 29  s extra assert()
2a6c0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74  .** statements t
2a6d0 68 61 74 20 74 65 73 74 20 63 6f 6e 64 69 74 69  hat test conditi
2a6e0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77  ons that are alw
2a6f0 61 79 73 20 74 72 75 65 20 66 6f 72 20 77 65 6c  ays true for wel
2a700 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
2a710 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2a720 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2a730 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63  database_never_c
2a740 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74  orrupt(.  Client
2a750 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2a760 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2a770 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2a780 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2a790 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a7a0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2a7b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2a7c0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2a7d0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2a7e0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2a7f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a800 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2a810 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2a820 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2a830 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2a840 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2a850 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2a860 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
2a870 4f 52 52 55 50 54 2c 20 31 29 3b 0a 20 20 72 65  ORRUPT, 1);.  re
2a880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2a890 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70  /*.** tclcmd:  p
2a8a0 63 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73  cache_stats.*/.s
2a8b0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2a8c0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 63 61  _TCLAPI test_pca
2a8d0 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69  che_stats(.  Cli
2a8e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2a8f0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
2a900 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
2a910 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
2a920 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a930 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2a940 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2a950 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2a960 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2a970 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2a980 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a990 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2a9a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a9b0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2a9c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2a9d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b  /.){.  int nMin;
2a9e0 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69  .  int nMax;.  i
2a9f0 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69  nt nCurrent;.  i
2aa00 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a  nt nRecyclable;.
2aa10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
2aa20 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
2aa30 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74  eStats(&nCurrent
2aa40 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20  , &nMax, &nMin, 
2aa50 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a  &nRecyclable);..
2aa60 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
2aa70 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
2aa80 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2aa90 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2aaa0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2aab0 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29  ("current", -1))
2aac0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2aad0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2aae0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2aaf0 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e  ewIntObj(nCurren
2ab00 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
2ab10 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ab20 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2ab30 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2ab40 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  max", -1));.  Tc
2ab50 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2ab60 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2ab70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2ab80 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c  bj(nMax));.  Tcl
2ab90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2aba0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2abb0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
2abc0 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29  gObj("min", -1))
2abd0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2abe0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2abf0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2ac00 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b  ewIntObj(nMin));
2ac10 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2ac20 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2ac30 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2ac40 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79  wStringObj("recy
2ac50 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20  clable", -1));. 
2ac60 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ac70 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2ac80 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2ac90 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c  ntObj(nRecyclabl
2aca0 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  e));..  Tcl_SetO
2acb0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2acc0 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
2acd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
2ace0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2acf0 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
2ad00 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
2ad10 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
2ad20 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69  b(void **aArg, i
2ad30 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20  nt nArg){.  int 
2ad40 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
2ad50 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a  ii<nArg; ii++){.
2ad60 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28      Tcl_EvalEx((
2ad70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72  Tcl_Interp *)aAr
2ad80 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e  g[ii], "unlock_n
2ad90 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f  otify", -1, TCL_
2ada0 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
2adb0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2adc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
2add0 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a  CK_NOTIFY */../*
2ade0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
2adf0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
2ae00 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20  fy db.*/.#ifdef 
2ae10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
2ae20 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
2ae30 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2ae40 4c 41 50 49 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  LAPI test_unlock
2ae50 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e  _notify(.  Clien
2ae60 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2ae70 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
2ae80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2ae90 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2aea0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2aeb0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2aec0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2aed0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2aee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2aef0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2af00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2af10 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2af20 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2af30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2af40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2af50 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2af60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2af70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2af80 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
2af90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2afa0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
2afb0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2afc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2afd0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
2afe0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2aff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
2b000 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  = sqlite3_unlock
2b010 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74  _notify(db, test
2b020 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
2b030 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72  b, (void *)inter
2b040 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  p);.  Tcl_SetRes
2b050 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2b060 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
2b070 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2b080 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2b090 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
2b0a0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2b0b0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2b0c0 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a  nt db ?NAME?.*/.
2b0d0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2b0e0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 77 61  E_TCLAPI test_wa
2b0f0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20  l_checkpoint(.  
2b100 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2b110 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
2b120 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2b130 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2b140 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2b150 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2b160 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2b170 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2b180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b190 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2b1a0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2b1b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2b1c0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2b1d0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
2b1e0 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  zDb = 0;.  sqlit
2b1f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
2b200 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
2b210 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
2b220 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2b230 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2b240 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22  bjv, "DB ?NAME?"
2b250 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b260 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2b270 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2b280 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2b290 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2b2a0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2b2b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b2c0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
2b2d0 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63   ){.    zDb = Tc
2b2e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2b2f0 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  [2]);.  }.  rc =
2b300 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
2b310 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
2b320 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
2b330 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2b340 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
2b350 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
2b360 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2b370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
2b380 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  :  sqlite3_wal_c
2b390 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20  heckpoint_v2 db 
2b3a0 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a  MODE ?NAME?.**.*
2b3b0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63  * This command c
2b3c0 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65  alls the wal_che
2b3d0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e  ckpoint_v2() fun
2b3e0 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2b3f0 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65  pecified.** mode
2b400 20 61 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69   argument (passi
2b410 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74  ve, full or rest
2b420 61 72 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74  art). If present
2b430 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  , the database n
2b440 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70  ame.** NAME is p
2b450 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2b460 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2b470 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
2b480 32 28 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a  2(). If it the.*
2b490 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20  * NAME argument 
2b4a0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
2b4b0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69  a NULL pointer i
2b4c0 73 20 70 61 73 73 65 64 20 69 6e 73 74 65 61 64  s passed instead
2b4d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63  ..**.** If wal_c
2b4e0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72  heckpoint_v2() r
2b4f0 65 74 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65  eturns any value
2b500 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2b510 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51  TE_BUSY or.** SQ
2b520 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68  LITE_OK, then th
2b530 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72  is command retur
2b540 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68  ns TCL_ERROR. Th
2b550 65 20 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20  e Tcl result is 
2b560 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72  set.** to the er
2b570 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61  ror message obta
2b580 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2b590 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a  3_errmsg()..**.*
2b5a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  * Otherwise, thi
2b5b0 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  s command return
2b5c0 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  s a list of thre
2b5d0 65 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  e integers. The 
2b5e0 66 69 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a  first integer.**
2b5f0 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
2b600 42 55 53 59 20 77 61 73 20 72 65 74 75 72 6e 65  BUSY was returne
2b610 64 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  d, or 0 otherwis
2b620 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
2b630 20 74 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a   two integers.**
2b640 20 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20   are the values 
2b650 72 65 74 75 72 6e 65 64 20 76 69 61 20 74 68 65  returned via the
2b660 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
2b670 72 73 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70  rs by wal_checkp
2b680 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74  oint_v2() -.** t
2b690 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
2b6a0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61  mes in the log a
2b6b0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2b6c0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
2b6d0 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  og.** that have 
2b6e0 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65  been checkpointe
2b6f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b700 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
2b710 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
2b720 6e 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  nt_v2(.  ClientD
2b730 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2b740 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2b750 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b760 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2b770 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2b780 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2b790 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2b7a0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2b7b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b7c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2b7d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b7e0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2b7f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2b800 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  .  char *zDb = 0
2b810 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2b820 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e  .  int rc;..  in
2b830 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e  t eMode;.  int n
2b840 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e  Log = -555;.  in
2b850 74 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a  t nCkpt = -555;.
2b860 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
2b870 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
2b880 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61   aMode[] = { "pa
2b890 73 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20  ssive", "full", 
2b8a0 22 72 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e  "restart", "trun
2b8b0 63 61 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73  cate", 0 };.  as
2b8c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
2b8d0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
2b8e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b8f0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
2b900 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
2b910 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
2b920 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
2b930 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
2b940 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
2b950 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29  NT_TRUNCATE==3 )
2b960 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
2b970 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
2b980 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2b990 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2b9a0 62 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e  bjv, "DB MODE ?N
2b9b0 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  AME?");.    retu
2b9c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b9d0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34  }..  if( objc==4
2b9e0 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63   ){.    zDb = Tc
2b9f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ba00 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [3]);.  }.  if( 
2ba10 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2ba20 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2ba30 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2ba40 29 20 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c  ) || (.      TCL
2ba50 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
2ba60 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32  romObj(0, objv[2
2ba70 5d 2c 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26  ], &eMode).   &&
2ba80 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
2ba90 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
2baa0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d  erp, objv[2], aM
2bab0 6f 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20  ode, "mode", 0, 
2bac0 26 65 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20  &eMode) .  )){. 
2bad0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bae0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
2baf0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
2bb00 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a  ckpoint_v2(db, z
2bb10 44 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67  Db, eMode, &nLog
2bb20 2c 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28  , &nCkpt);.  if(
2bb30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
2bb40 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  & rc!=SQLITE_BUS
2bb50 59 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Y ){.    const c
2bb60 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20  har *zErrCode = 
2bb70 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
2bb80 63 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65  c);.    Tcl_Rese
2bb90 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2bba0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2bbb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
2bbc0 72 72 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28  rrCode, " - ", (
2bbd0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
2bbe0 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
2bbf0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bc00 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74  ROR;.  }..  pRet
2bc10 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2bc20 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2bc30 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bc40 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2bc50 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49  wIntObj(rc==SQLI
2bc60 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20  TE_BUSY?1:0));. 
2bc70 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2bc80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2bc90 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2bca0 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20  ntObj(nLog));.  
2bcb0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bcc0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2bcd0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2bce0 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20  tObj(nCkpt));.  
2bcf0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2bd00 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
2bd10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2bd20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
2bd30 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  d:  sqlite3_wal_
2bd40 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64  autocheckpoint d
2bd50 62 20 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69  b VALUE.*/.stati
2bd60 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2bd70 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 61 75 74  API test_wal_aut
2bd80 6f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  ocheckpoint(.  C
2bd90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2bda0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2bdb0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2bdc0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2bdd0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2bde0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2bdf0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2be00 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2be10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2be20 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2be30 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2be40 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2be50 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2be60 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2be70 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
2be80 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20    int iVal;...  
2be90 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
2bea0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2beb0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2bec0 62 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29  bjv, "DB VALUE")
2bed0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2bee0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
2bef0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2bf00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2bf10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2bf20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
2bf30 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
2bf40 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29   objv[2], &iVal)
2bf50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2bf60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bf70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2bf80 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
2bf90 6e 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20  nt(db, iVal);.  
2bfa0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2bfb0 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72  interp);.  if( r
2bfc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bfd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2bfe0 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74  zErrCode = sqlit
2bff0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20  e3ErrName(rc);. 
2c000 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2c010 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2c020 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72  NewStringObj(zEr
2c030 72 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  rCode, -1));.   
2c040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c050 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
2c060 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
2c070 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74  ** tclcmd:  test
2c080 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43  _sqlite3_log ?SC
2c090 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  RIPT?.*/.static 
2c0a0 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61  struct LogCallba
2c0b0 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ck {.  Tcl_Inter
2c0c0 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63  p *pInterp;.  Tc
2c0d0 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c  l_Obj *pObj;.} l
2c0e0 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c  ogcallback = {0,
2c0f0 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64   0};.static void
2c100 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f   xLogcallback(vo
2c110 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20  id *unused, int 
2c120 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29  err, char *zMsg)
2c130 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65  {.  Tcl_Obj *pNe
2c140 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  w = Tcl_Duplicat
2c150 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  eObj(logcallback
2c160 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e  .pObj);.  Tcl_In
2c170 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
2c180 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2c190 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
2c1a0 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c      0, pNew, Tcl
2c1b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
2c1c0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72  lite3ErrName(err
2c1d0 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63  ), -1).  );.  Tc
2c1e0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2c1f0 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20  lement(0, pNew, 
2c200 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2c210 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54  (zMsg, -1));.  T
2c220 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67  cl_EvalObjEx(log
2c230 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
2c240 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c  , pNew, TCL_EVAL
2c250 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c  _GLOBAL|TCL_EVAL
2c260 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
2c270 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65  DecrRefCount(pNe
2c280 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  w);.}.static int
2c290 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
2c2a0 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28  est_sqlite3_log(
2c2b0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2c2c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2c2d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2c2e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2c2f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2c300 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2c310 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2c320 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2c330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2c340 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2c350 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2c360 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2c370 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2c380 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20  if( objc>2 ){.  
2c390 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2c3a0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2c3b0 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
2c3c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2c3d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ROR;.  }.  if( l
2c3e0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
2c3f0 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
2c400 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
2c410 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
2c420 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
2c430 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  = 0;.    logcall
2c440 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30  back.pInterp = 0
2c450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
2c460 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
2c470 49 47 5f 4c 4f 47 2c 20 28 76 6f 69 64 2a 29 30  IG_LOG, (void*)0
2c480 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d  , (void*)0);.  }
2c490 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b  .  if( objc>1 ){
2c4a0 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
2c4b0 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b  .pObj = objv[1];
2c4c0 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2c4d0 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63  Count(logcallbac
2c4e0 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67  k.pObj);.    log
2c4f0 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
2c500 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73   = interp;.    s
2c510 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
2c520 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
2c530 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 28   xLogcallback, (
2c540 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  void*)0);.  }.  
2c550 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2c560 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f  ../*.**     tcl_
2c570 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e  objproc COMMANDN
2c580 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a  AME ARGS....**.*
2c590 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d  * Run a TCL comm
2c5a0 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62  and using its ob
2c5b0 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
2c5c0 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72    Throw an error
2c5d0 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61   if.** the comma
2c5e0 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
2c5f0 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  c interface..*/.
2c600 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2c610 45 5f 54 43 4c 41 50 49 20 72 75 6e 41 73 4f 62  E_TCLAPI runAsOb
2c620 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20  jProc(.  void * 
2c630 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2c640 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2c650 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2c660 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2c670 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43  bjv[].){.  Tcl_C
2c680 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
2c690 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
2c6a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2c6b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2c6c0 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e  objv, "COMMAND .
2c6d0 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
2c6e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2c6f0 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
2c700 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
2c710 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2c720 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e  objv[1]), &cmdIn
2c730 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
2c740 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2c750 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
2c760 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20   found: ",.     
2c770 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2c780 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
2c790 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2c7a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c7b0 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f   }.  if( cmdInfo
2c7c0 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20  .objProc==0 ){. 
2c7d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2c7e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
2c7f0 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50  mand has no objP
2c800 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  roc: ",.        
2c810 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
2c820 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
2c830 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
2c840 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2c850 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f    return cmdInfo
2c860 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f  .objProc(cmdInfo
2c870 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20  .objClientData, 
2c880 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20  interp, objc-1, 
2c890 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e  objv+1);.}..#ifn
2c8a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c8b0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41  EXPLAIN./*.** WA
2c8c0 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f  RNING: The follo
2c8d0 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70  wing function, p
2c8e0 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
2c8f0 50 6c 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61  Plan() is an exa
2c900 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78  ct.** copy of ex
2c910 61 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20  ample code from 
2c920 65 71 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c  eqp.in (eqp.html
2c930 29 2e 20 49 66 20 74 68 69 73 20 63 6f 64 65 20  ). If this code 
2c940 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  is modified,.** 
2c950 74 68 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  then the documen
2c960 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64  tation copy need
2c970 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  s to be modified
2c980 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a   as well..*/./*.
2c990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d  ** Argument pStm
2c9a0 74 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  t is a prepared 
2c9b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  SQL statement. T
2c9c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
2c9d0 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c  piles.** an EXPL
2c9e0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
2c9f0 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74  ommand to report
2ca00 20 6f 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   on the prepared
2ca10 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61   statement,.** a
2ca20 6e 64 20 70 72 69 6e 74 73 20 74 68 65 20 72 65  nd prints the re
2ca30 70 6f 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75  port to stdout u
2ca40 73 69 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a  sing printf()..*
2ca50 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61  /.int printExpla
2ca60 69 6e 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69  inQueryPlan(sqli
2ca70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
2ca80 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2ca90 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
2caa0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c      /* Input SQL
2cab0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70   */.  char *zExp
2cac0 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lain;           
2cad0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74        /* SQL wit
2cae0 68 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  h EXPLAIN QUERY 
2caf0 50 4c 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a  PLAN prepended *
2cb00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2cb10 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *pExplain;     
2cb20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
2cb30 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2cb40 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  AN command */.  
2cb50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
2cb80 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  rom sqlite3_prep
2cb90 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a  are_v2() */..  z
2cba0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
2cbb0 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  l(pStmt);.  if( 
2cbc0 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
2cbd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
2cbe0 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c    zExplain = sql
2cbf0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
2cc00 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2cc10 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69   %s", zSql);.  i
2cc20 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29  f( zExplain==0 )
2cc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cc40 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71  OMEM;..  rc = sq
2cc50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2cc60 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64  (sqlite3_db_hand
2cc70 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c  le(pStmt), zExpl
2cc80 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  ain, -1, &pExpla
2cc90 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  in, 0);.  sqlite
2cca0 33 5f 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29  3_free(zExplain)
2ccb0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2ccc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2ccd0 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  c;..  while( SQL
2cce0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2ccf0 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
2cd00 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65  ){.    int iSele
2cd10 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ctid = sqlite3_c
2cd20 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
2cd30 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  in, 0);.    int 
2cd40 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33  iOrder = sqlite3
2cd50 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
2cd60 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e  lain, 1);.    in
2cd70 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65  t iFrom = sqlite
2cd80 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
2cd90 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63  plain, 2);.    c
2cda0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61  onst char *zDeta
2cdb0 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  il = (const char
2cdc0 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
2cdd0 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
2cde0 20 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66   3);..    printf
2cdf0 28 22 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22  ("%d %d %d %s\n"
2ce00 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72  , iSelectid, iOr
2ce10 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74  der, iFrom, zDet
2ce20 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ail);.  }..  ret
2ce30 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
2ce40 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
2ce50 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  }..static int SQ
2ce60 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce70 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f  _print_eqp(.  vo
2ce80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2ce90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2cea0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2ceb0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2cec0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2ced0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2cee0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
2cef0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2cf00 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2cf10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2cf20 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
2cf30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2cf40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2cf50 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
2cf60 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2cf70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2cf80 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
2cf90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
2cfa0 3d 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  = printExplainQu
2cfb0 65 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a  eryPlan(pStmt);.
2cfc0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65    /* This is nee
2cfd0 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  ded on Windows s
2cfe0 6f 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61  o that a test ca
2cff0 73 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20  se using this . 
2d000 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e   ** function can
2d010 20 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70   open a read pip
2d020 65 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75  e and get the ou
2d030 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69  tput of.  ** pri
2d040 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
2d050 61 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79  an() immediately
2d060 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28  ..  */.  fflush(
2d070 73 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53  stdout);.  Tcl_S
2d080 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2d090 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2d0a0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
2d0b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d0c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d0d0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
2d0e0 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  /../*.** sqlite3
2d0f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45  _test_control VE
2d100 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74  RB ARGS....*/.st
2d110 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2d120 54 43 4c 41 50 49 20 74 65 73 74 5f 74 65 73 74  TCLAPI test_test
2d130 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64  _control(.  void
2d140 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2d150 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2d160 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2d170 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2d180 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
2d190 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20  ruct Verb {.    
2d1a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2d1b0 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e;.    int i;.  
2d1c0 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20  } aVerb[] = {.  
2d1d0 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54    { "SQLITE_TEST
2d1e0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
2d1f0 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45  AULT", SQLITE_TE
2d200 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
2d210 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b  _FAULT }, .    {
2d220 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2d230 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20  L_SORTER_MMAP", 
2d240 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
2d250 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20  TRL_SORTER_MMAP 
2d260 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53      }, .    { "S
2d270 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2d280 4d 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20  MPOSTER",       
2d290 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2d2a0 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20  _IMPOSTER       
2d2b0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
2d2c0 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61  Verb;.  int iFla
2d2d0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
2d2e0 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2d2f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2d300 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2d310 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e  jv, "VERB ARGS..
2d320 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2d330 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2d340 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
2d350 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
2d360 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20  (.      interp, 
2d370 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20  objv[1], aVerb, 
2d380 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29  sizeof(aVerb[0])
2d390 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56  , "VERB", 0, &iV
2d3a0 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  erb.  );.  if( r
2d3b0 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
2d3c0 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20  rn rc;..  iFlag 
2d3d0 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69  = aVerb[iVerb].i
2d3e0 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61  ;.  switch( iFla
2d3f0 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  g ){.    case SQ
2d400 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
2d410 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
2d420 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a  .      int val;.
2d430 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
2d440 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
2d450 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2d460 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
2d470 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20  ONOFF");.       
2d480 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d490 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2d4a0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2d4b0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2d4c0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
2d4d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2d4e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2d4f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2d500 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2d510 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2d520 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  , val);.      br
2d530 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2d540 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2d550 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
2d560 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61  : {.      int va
2d570 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
2d580 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20   *db;.      if( 
2d590 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
2d5a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2d5b0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
2d5c0 62 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54 22 29  bjv, "DB LIMIT")
2d5d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d5e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2d5f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65    }.      if( ge
2d600 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d610 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2d620 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20  (objv[2]), &db) 
2d630 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2d640 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  OR;.      if( Tc
2d650 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2d660 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2d670 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
2d680 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2d690 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2d6a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2d6b0 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
2d6c0 50 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20 20 20  P, db, val);.   
2d6d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d6e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d6f0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
2d700 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ER: {.      int 
2d710 6f 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20 20 20  onOff, tnum;.   
2d720 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d730 44 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  DbName;.      sq
2d740 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
2d750 20 69 66 28 20 6f 62 6a 63 21 3d 36 20 29 7b 0a   if( objc!=6 ){.
2d760 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
2d770 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2d780 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62   2, objv, "DB db
2d790 4e 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75 6d 22  Name onOff tnum"
2d7a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d7b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2d7c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
2d7d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2d7e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2d7f0 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29  g(objv[2]), &db)
2d800 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d810 52 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62 4e 61  ROR;.      zDbNa
2d820 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
2d830 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
2d840 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
2d850 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
2d860 20 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66   objv[4], &onOff
2d870 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2d880 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
2d890 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2d8a0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  j(interp, objv[5
2d8b0 5d 2c 20 26 74 6e 75 6d 29 20 29 20 72 65 74 75  ], &tnum) ) retu
2d8c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d8d0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2d8e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2d8f0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2d900 52 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  R, db, zDbName, 
2d910 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20  onOff, tnum);.  
2d920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d930 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65  .  }..  Tcl_Rese
2d940 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2d950 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d960 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2d970 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64 65  OS_UNIX.#include
2d980 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69   <sys/time.h>.#i
2d990 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f  nclude <sys/reso
2d9a0 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20  urce.h>..static 
2d9b0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2d9c0 49 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65  I test_getrusage
2d9d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2d9e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2d9f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2da00 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2da10 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2da20 0a 29 7b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  .){.  char buf[1
2da30 30 32 34 5d 3b 0a 20 20 73 74 72 75 63 74 20 72  024];.  struct r
2da40 75 73 61 67 65 20 72 3b 0a 20 20 6d 65 6d 73 65  usage r;.  memse
2da50 74 28 26 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&r, 0, sizeof(
2da60 72 29 29 3b 0a 20 20 67 65 74 72 75 73 61 67 65  r));.  getrusage
2da70 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 72  (RUSAGE_SELF, &r
2da80 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  );..  sqlite3_sn
2da90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 62 75  printf(sizeof(bu
2daa0 66 29 2c 20 62 75 66 2c 0a 20 20 20 20 22 72 75  f), buf,.    "ru
2dab0 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72  _utime=%d.%06d r
2dac0 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64 20  u_stime=%d.%06d 
2dad0 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f  ru_minflt=%d ru_
2dae0 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20  majflt=%d", .   
2daf0 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65   (int)r.ru_utime
2db00 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
2db10 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_utime.tv_usec
2db20 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2db30 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28  _stime.tv_sec, (
2db40 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74  int)r.ru_stime.t
2db50 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e  v_usec, .    (in
2db60 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28  t)r.ru_minflt, (
2db70 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a  int)r.ru_majflt.
2db80 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62    );.  Tcl_SetOb
2db90 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2dba0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2dbb0 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65  (buf, -1));.  re
2dbc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2dbd0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
2dbe0 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49  E_OS_WIN./*.** I
2dbf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
2dc00 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
2dc10 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  thread into the 
2dc20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63  windows file loc
2dc30 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e  ker.** backgroun
2dc40 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72  d thread..*/.str
2dc50 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2dc60 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76  ker {.  char *ev
2dc70 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Name;       /* N
2dc80 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20  ame of event to 
2dc90 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74  signal thread st
2dca0 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c  artup */.  HANDL
2dcb0 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  E h;           /
2dcc0 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20  * Handle of the 
2dcd0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
2dce0 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79  d */.  int delay
2dcf0 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  1;         /* De
2dd00 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69  lay before locki
2dd10 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61  ng */.  int dela
2dd20 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  y2;         /* D
2dd30 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f  elay before unlo
2dd40 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f  cking */.  int o
2dd50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2dd60 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f  * Finished ok */
2dd70 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20  .  int err;     
2dd80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2dd90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2dda0 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  s */.};.#endif..
2ddb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2ddc0 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f  IN.#include <pro
2ddd0 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68  cess.h>./*.** Th
2dde0 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  e background thr
2ddf0 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 66 69  ead that does fi
2de00 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  le locking..*/.s
2de10 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
2de20 45 5f 43 44 45 43 4c 20 77 69 6e 33 32 5f 66 69  E_CDECL win32_fi
2de30 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a  le_locker(void *
2de40 70 41 70 70 44 61 74 61 29 7b 0a 20 20 73 74 72  pAppData){.  str
2de50 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2de60 6b 65 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74  ker *p = (struct
2de70 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
2de80 2a 29 70 41 70 70 44 61 74 61 3b 0a 20 20 69 66  *)pAppData;.  if
2de90 28 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20  ( p->evName ){. 
2dea0 20 20 20 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f     HANDLE ev = O
2deb0 70 65 6e 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d  penEvent(EVENT_M
2dec0 4f 44 49 46 59 5f 53 54 41 54 45 2c 20 46 41 4c  ODIFY_STATE, FAL
2ded0 53 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a  SE, p->evName);.
2dee0 20 20 20 20 69 66 20 28 20 65 76 20 29 7b 0a 20      if ( ev ){. 
2def0 20 20 20 20 20 53 65 74 45 76 65 6e 74 28 65 76       SetEvent(ev
2df00 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
2df10 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a  ndle(ev);.    }.
2df20 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c    }.  if( p->del
2df30 61 79 31 20 29 20 53 6c 65 65 70 28 70 2d 3e 64  ay1 ) Sleep(p->d
2df40 65 6c 61 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f  elay1);.  if( Lo
2df50 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20  ckFile(p->h, 0, 
2df60 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29  0, 100000000, 0)
2df70 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 70 2d   ){.    Sleep(p-
2df80 3e 64 65 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e  >delay2);.    Un
2df90 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30  lockFile(p->h, 0
2dfa0 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20  , 0, 100000000, 
2dfb0 30 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20  0);.    p->ok = 
2dfc0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2dfd0 70 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a  p->err = 1;.  }.
2dfe0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d    CloseHandle(p-
2dff0 3e 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b  >h);.  p->h = 0;
2e000 0a 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30  .  p->delay1 = 0
2e010 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20  ;.  p->delay2 = 
2e020 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
2e030 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
2e040 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77  *.**      lock_w
2e050 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41  in32_file FILENA
2e060 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32  ME DELAY1 DELAY2
2e070 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78  .**.** Get an ex
2e080 63 6c 75 73 69 76 65 20 6d 61 6e 64 69 74 6f 72  clusive manditor
2e090 79 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66  y lock on file f
2e0a0 6f 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73  or DELAY2 millis
2e0b0 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20  econds..** Wait 
2e0c0 44 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f  DELAY1 milliseco
2e0d0 6e 64 73 20 62 65 66 6f 72 65 20 61 63 71 75 69  nds before acqui
2e0e0 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  ring the lock..*
2e0f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2e100 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32  ITE_TCLAPI win32
2e110 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f  _file_lock(.  vo
2e120 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2e130 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2e140 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2e150 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2e160 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2e170 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2e180 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20  n32FileLocker x 
2e190 3d 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f  = { "win32_file_
2e1a0 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20  lock", 0, 0, 0, 
2e1b0 30 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  0, 0 };.  const 
2e1c0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
2e1d0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
2e1e0 5d 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d  ];.  int retry =
2e1f0 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b   0;.  HANDLE ev;
2e200 0a 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74  .  DWORD wResult
2e210 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
2e220 3d 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b  =4 && objc!=1 ){
2e230 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2e240 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2e250 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
2e260 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29   DELAY1 DELAY2")
2e270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2e280 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2e290 28 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20  ( objc==1 ){.   
2e2a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2e2b0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
2e2c0 7a 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20  zBuf, "%d %d %d 
2e2d0 25 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  %d %d",.        
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f               x.o
2e2f0 6b 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61  k, x.err, x.dela
2e300 79 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e  y1, x.delay2, x.
2e310 68 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  h);.    Tcl_Appe
2e320 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e330 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
2e340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2e350 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  _OK;.  }.  while
2e360 28 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33  ( x.h && retry<3
2e370 30 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b  0 ){.    retry++
2e380 3b 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29  ;.    Sleep(100)
2e390 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20  ;.  }.  if( x.h 
2e3a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2e3b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2e3c0 22 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30  "busy", (char*)0
2e3d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e3e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2e3f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2e400 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2e410 76 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29  v[2], &x.delay1)
2e420 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2e430 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
2e440 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
2e450 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78  erp, objv[3], &x
2e460 2e 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72  .delay2) ) retur
2e470 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
2e480 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  Filename = Tcl_G
2e490 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2e4a0 29 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74  );.  x.h = Creat
2e4b0 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  eFile(zFilename,
2e4c0 20 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45   GENERIC_READ|GE
2e4d0 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20  NERIC_WRITE,.   
2e4e0 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
2e4f0 53 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f  SHARE_READ|FILE_
2e500 53 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20  SHARE_WRITE, 0, 
2e510 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20  OPEN_ALWAYS,.   
2e520 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
2e530 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
2e540 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68  , 0);.  if( !x.h
2e550 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2e560 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e570 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
2e580 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  le: ", zFilename
2e590 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2e5a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2e5b0 52 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72  R;.  }.  ev = Cr
2e5c0 65 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20  eateEvent(NULL, 
2e5d0 54 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65  TRUE, FALSE, x.e
2e5e0 76 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21  vName);.  if ( !
2e5f0 65 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  ev ){.    Tcl_Ap
2e600 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2e610 70 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  p, "cannot creat
2e620 65 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76  e event: ", x.ev
2e630 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
2e640 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e650 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65  ERROR;.  }.  _be
2e660 67 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f  ginthread(win32_
2e670 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20  file_locker, 0, 
2e680 28 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c  (void*)&x);.  Sl
2e690 65 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28  eep(0);.  if ( (
2e6a0 77 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f  wResult = WaitFo
2e6b0 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76  rSingleObject(ev
2e6c0 2c 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f  , 10000))!=WAIT_
2e6d0 4f 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20  OBJECT_0 ){.    
2e6e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2e6f0 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2e700 42 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65  Buf, "0x%x", wRe
2e710 73 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41  sult);.    Tcl_A
2e720 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2e730 72 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64  rp, "wait failed
2e740 3a 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  : ", zBuf, (char
2e750 2a 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  *)0);.    CloseH
2e760 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72  andle(ev);.    r
2e770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e780 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64  .  }.  CloseHand
2e790 6c 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e  le(ev);.  return
2e7a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2e7b0 2a 20 20 20 20 20 20 65 78 69 73 74 73 5f 77 69  *      exists_wi
2e7c0 6e 33 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a  n32_path PATH.**
2e7d0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
2e7e0 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
2e7f0 69 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74  ified path exist
2e800 73 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  s, whose fully q
2e810 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a  ualified name.**
2e820 20 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 20   may exceed 260 
2e830 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
2e840 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
2e850 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
2e860 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2e870 43 4c 41 50 49 20 77 69 6e 33 32 5f 65 78 69 73  CLAPI win32_exis
2e880 74 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64 20  ts_path(.  void 
2e890 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2e8a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e8b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2e8c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2e8d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2e8e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2e8f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2e900 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2e910 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65   "PATH");.    re
2e920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e930 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
2e940 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2e950 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
2e960 28 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65 41  (.      GetFileA
2e970 74 74 72 69 62 75 74 65 73 57 28 20 54 63 6c 5f  ttributesW( Tcl_
2e980 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b  GetUnicode(objv[
2e990 31 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  1]))!=INVALID_FI
2e9a0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 29  LE_ATTRIBUTES ))
2e9b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2e9c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2e9d0 20 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65   find_win32_file
2e9e0 20 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52   PATTERN.**.** R
2e9f0 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66  eturns a list of
2ea00 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 69   entries in a di
2ea10 72 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61 74  rectory that mat
2ea20 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ch the specified
2ea30 20 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f   pattern,.** who
2ea40 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2ea50 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2ea60 65 64 20 32 34 38 20 63 68 61 72 61 63 74 65 72  ed 248 character
2ea70 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2ea80 78 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f  xed with.** "\\?
2ea90 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2eaa0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2eab0 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 28  win32_find_file(
2eac0 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2ead0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2eae0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2eaf0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2eb00 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2eb10 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64  {.  HANDLE hFind
2eb20 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48  File = INVALID_H
2eb30 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 57  ANDLE_VALUE;.  W
2eb40 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20  IN32_FIND_DATAW 
2eb50 66 69 6e 64 44 61 74 61 3b 0a 20 20 54 63 6c 5f  findData;.  Tcl_
2eb60 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20  Obj *listObj;.  
2eb70 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
2eb80 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2eb90 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2eba0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2ebb0 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54 45 52 4e  , objv, "PATTERN
2ebc0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2ebd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2ebe0 68 46 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64  hFindFile = Find
2ebf0 46 69 72 73 74 46 69 6c 65 57 28 54 63 6c 5f 47  FirstFileW(Tcl_G
2ec00 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2ec10 5d 29 2c 20 26 66 69 6e 64 44 61 74 61 29 3b 0a  ]), &findData);.
2ec20 20 20 69 66 28 20 68 46 69 6e 64 46 69 6c 65 3d    if( hFindFile=
2ec30 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
2ec40 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 54 63 6c  VALUE ){.    Tcl
2ec50 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2ec60 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2ec70 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2ec80 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2ec90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2eca0 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a 20 3d 20    }.  listObj = 
2ecb0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
2ecc0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2ecd0 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 64 6f 20  (listObj);.  do 
2ece0 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  {.    Tcl_ListOb
2ecf0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2ed00 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20  nterp, listObj, 
2ed10 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64 65 4f 62  Tcl_NewUnicodeOb
2ed20 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44  j(.        findD
2ed30 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65 2c 20 2d  ata.cFileName, -
2ed40 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2ed50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2ed60 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
2ed70 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  j, Tcl_NewWideIn
2ed80 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69  tObj(.        fi
2ed90 6e 64 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  ndData.dwFileAtt
2eda0 72 69 62 75 74 65 73 29 29 3b 0a 20 20 7d 20 77  ributes));.  } w
2edb0 68 69 6c 65 28 20 46 69 6e 64 4e 65 78 74 46 69  hile( FindNextFi
2edc0 6c 65 57 28 68 46 69 6e 64 46 69 6c 65 2c 20 26  leW(hFindFile, &
2edd0 66 69 6e 64 44 61 74 61 29 20 29 3b 0a 20 20 6c  findData) );.  l
2ede0 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
2edf0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
2ee00 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45   lastErrno!=NO_E
2ee10 52 52 4f 52 20 26 26 20 6c 61 73 74 45 72 72 6e  RROR && lastErrn
2ee20 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45  o!=ERROR_NO_MORE
2ee30 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20 20 46 69  _FILES ){.    Fi
2ee40 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c  ndClose(hFindFil
2ee50 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  e);.    Tcl_Decr
2ee60 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a  RefCount(listObj
2ee70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
2ee80 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2ee90 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2eea0 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2eeb0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2eec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2eed0 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46  FindClose(hFindF
2eee0 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  ile);.  Tcl_SetO
2eef0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2ef00 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 72 65 74   listObj);.  ret
2ef10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2ef20 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c 65 74 65  *.**      delete
2ef30 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45  _win32_file FILE
2ef40 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  NAME.**.** Delet
2ef50 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2ef60 20 66 69 6c 65 2c 20 77 68 6f 73 65 20 66 75 6c   file, whose ful
2ef70 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
2ef80 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 36 30  e may exceed 260
2ef90 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
2efa0 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
2efb0 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
2efc0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2efd0 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f  TE_TCLAPI win32_
2efe0 64 65 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76  delete_file(.  v
2eff0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2f000 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f010 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2f020 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2f030 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2f040 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2f050 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2f060 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2f070 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29  bjv, "FILENAME")
2f080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2f090 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2f0a0 28 20 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54  ( !DeleteFileW(T
2f0b0 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
2f0c0 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54  jv[1])) ){.    T
2f0d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2f0e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2f0f0 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2f100 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2f110 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f120 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65  ;.  }.  Tcl_Rese
2f130 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2f140 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2f150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2f160 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44  make_win32_dir D
2f170 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43  IRECTORY.**.** C
2f180 72 65 61 74 65 73 20 74 68 65 20 73 70 65 63 69  reates the speci
2f190 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20  fied directory, 
2f1a0 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
2f1b0 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65  ified name may e
2f1c0 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61  xceed 248.** cha
2f1d0 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2f1e0 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
2f1f0 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
2f200 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2f210 50 49 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a  PI win32_mkdir(.
2f220 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2f230 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2f240 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2f250 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2f260 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2f270 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2f280 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2f290 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2f2a0 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f  , objv, "DIRECTO
2f2b0 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RY");.    return
2f2c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f2d0 20 20 69 66 28 20 21 43 72 65 61 74 65 44 69 72    if( !CreateDir
2f2e0 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55  ectoryW(Tcl_GetU
2f2f0 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c  nicode(objv[1]),
2f300 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63   NULL) ){.    Tc
2f310 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2f320 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2f330 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2f340 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2f350 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f360 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2f370 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2f380 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2f390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72  .}../*.**      r
2f3a0 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20  emove_win32_dir 
2f3b0 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20  DIRECTORY.**.** 
2f3c0 52 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63  Removes the spec
2f3d0 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c  ified directory,
2f3e0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2f3f0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2f400 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68  exceed 248.** ch
2f410 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2f420 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2f430 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2f440 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2f450 41 50 49 20 77 69 6e 33 32 5f 72 6d 64 69 72 28  API win32_rmdir(
2f460 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2f470 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2f480 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2f490 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2f4a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2f4b0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2f4c0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2f4d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2f4e0 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54  1, objv, "DIRECT
2f4f0 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORY");.    retur
2f500 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f510 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69  .  if( !RemoveDi
2f520 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74  rectoryW(Tcl_Get
2f530 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2f540 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2f550 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2f560 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2f570 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2f580 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2f590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f5a0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2f5b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2f5c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2f5d0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  ndif.../*.**    
2f5e0 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
2f5f0 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f  ontrol DB OPT BO
2f600 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62  OLEAN.**.** Enab
2f610 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75  le or disable qu
2f620 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ery optimization
2f630 73 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  s using the sqli
2f640 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2f650 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2f660 20 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f    Disable if BOO
2f670 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e  LEAN is false an
2f680 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c  d enable if BOOL
2f690 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20  EAN is true..** 
2f6a0 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20  OPT is the name 
2f6b0 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  of the optimizat
2f6c0 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ion to be disabl
2f6d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2f6e0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2f6f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2f700 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
2f710 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2f720 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2f730 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2f740 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2f750 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
2f760 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2f770 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
2f780 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  pt;.  int onoff;
2f790 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b  .  int mask = 0;
2f7a0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2f7b0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
2f7c0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
2f7d0 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b  e;.    int mask;
2f7e0 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a  .  } aOpt[] = {.
2f7f0 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20      { "all",    
2f800 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2f810 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20  ITE_AllOpts     
2f820 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e     },.    { "non
2f830 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2f840 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
2f850 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f860 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e  { "query-flatten
2f870 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  er",     SQLITE_
2f880 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d  QueryFlattener }
2f890 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d  ,.    { "column-
2f8a0 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 53  cache",        S
2f8b0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
2f8c0 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67  e    },.    { "g
2f8d0 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20  roupby-order",  
2f8e0 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75       SQLITE_Grou
2f8f0 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20  pByOrder   },.  
2f900 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73    { "factor-cons
2f910 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54  tants",    SQLIT
2f920 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
2f930 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69   },.    { "disti
2f940 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20  nct-opt",       
2f950 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2f960 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Opt    },.    { 
2f970 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22  "cover-idx-scan"
2f980 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f  ,      SQLITE_Co
2f990 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a  verIdxScan   },.
2f9a0 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d      { "order-by-
2f9b0 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c  idx-join",   SQL
2f9c0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2f9d0 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61  in },.    { "tra
2f9e0 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20  nsitive",       
2f9f0 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69     SQLITE_Transi
2fa00 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  tive     },.    
2fa10 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f  { "subquery-coro
2fa20 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f  utine",  SQLITE_
2fa30 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d  SubqCoroutine  }
2fa40 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f  ,.    { "omit-no
2fa50 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53  op-join",      S
2fa60 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2fa70 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73  in   },.    { "s
2fa80 74 61 74 33 22 2c 20 20 20 20 20 20 20 20 20 20  tat3",          
2fa90 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74       SQLITE_Stat
2faa0 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  34         },.  
2fab0 20 20 7b 20 22 73 74 61 74 34 22 2c 20 20 20 20    { "stat4",    
2fac0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2fad0 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20  E_Stat34        
2fae0 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
2faf0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
2fb00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2fb10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2fb20 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e   "DB OPT BOOLEAN
2fb30 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2fb40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2fb50 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2fb60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2fb70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2fb80 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2fb90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
2fba0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
2fbb0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2fbc0 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[3], &onoff) )
2fbd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fbe0 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f  R;.  zOpt = Tcl_
2fbf0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2fc00 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
2fc10 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
2fc20 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
2fc30 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
2fc40 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69  cmp(zOpt, aOpt[i
2fc50 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zOptName)==0 )
2fc60 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61  {.      mask = a
2fc70 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  Opt[i].mask;.   
2fc80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2fc90 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20    }.  if( onoff 
2fca0 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a  ) mask = ~mask;.
2fcb0 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
2fcc0 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
2fcd0 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  t[0]) ){.    Tcl
2fce0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2fcf0 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
2fd00 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68  ptimization - sh
2fd10 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22  ould be one of:"
2fd20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fd30 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
2fd40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2fd50 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
2fd60 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
2fd70 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
2fd80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2fd90 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d  rp, " ", aOpt[i]
2fda0 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72  .zOptName, (char
2fdb0 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)0);.    }.    
2fdc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2fdd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2fde0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2fdf0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2fe00 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20  IMIZATIONS, db, 
2fe10 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  mask);.  return 
2fe20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2fe30 20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63       load_static
2fe40 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41  _extension DB NA
2fe50 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61  ME ....**.** Loa
2fe60 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74  d one or more st
2fe70 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
2fe80 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  extensions..*/.s
2fe90 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2fea0 5f 54 43 4c 41 50 49 20 74 63 6c 4c 6f 61 64 53  _TCLAPI tclLoadS
2feb0 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d  taticExtensionCm
2fec0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
2fed0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2fee0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2fef0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2ff00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2ff10 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ].){.  extern in
2ff20 74 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68  t sqlite3_amatch
2ff30 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2ff40 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2ff50 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2ff60 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2ff70 20 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f   sqlite3_carray_
2ff80 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2ff90 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2ffa0 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2ffb0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2ffc0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f  sqlite3_closure_
2ffd0 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2ffe0 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2fff0 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
30000 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
30010 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74  sqlite3_csv_init
30020 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
30030 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
30040 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
30050 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30060 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71  te3_eval_init(sq
30070 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
30080 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
30090 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
300a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
300b0 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c  _fileio_init(sql
300c0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
300d0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
300e0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
300f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30100 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69  fuzzer_init(sqli
30110 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
30120 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
30130 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
30140 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
30150 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eee_init(sqlite3
30160 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
30170 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
30180 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
30190 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  int sqlite3_next
301a0 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  char_init(sqlite
301b0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
301c0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
301d0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
301e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72   int sqlite3_per
301f0 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c  centile_init(sql
30200 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
30210 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
30220 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
30230 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30240 72 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69  regexp_init(sqli
30250 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
30260 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
30270 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
30280 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72  rn int sqlite3_r
30290 65 6d 65 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c  emember_init(sql
302a0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
302b0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
302c0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
302d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
302e0 73 65 72 69 65 73 5f 69 6e 69 74 28 73 71 6c 69  series_init(sqli
302f0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
30300 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
30310 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
30320 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
30330 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c  pellfix_init(sql
30340 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
30350 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
30360 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
30370 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
30380 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69  totype_init(sqli
30390 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
303a0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
303b0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
303c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  rn int sqlite3_w
303d0 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28  holenumber_init(
303e0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
303f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
30400 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
30410 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30420 65 33 5f 75 6e 69 6f 6e 76 74 61 62 5f 69 6e 69  e3_unionvtab_ini
30430 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30440 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30450 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30460 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
30470 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
30480 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65  t char *zExtName
30490 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69  ;.    int (*pIni
304a0 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  t)(sqlite3*,char
304b0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
304c0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
304d0 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b  .  } aExtension[
304e0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61  ] = {.    { "ama
304f0 74 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  tch",           
30500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61       sqlite3_ama
30510 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20  tch_init        
30520 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30530 22 63 61 72 72 61 79 22 2c 20 20 20 20 20 20 20  "carray",       
30540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30550 5f 63 61 72 72 61 79 5f 69 6e 69 74 20 20 20 20  _carray_init    
30560 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30570 20 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20    { "closure",  
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30590 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69  ite3_closure_ini
305a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  t              }
305b0 2c 0a 20 20 20 20 7b 20 22 63 73 76 22 2c 20 20  ,.    { "csv",  
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305d0 20 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69   sqlite3_csv_ini
305e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
305f0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76 61     },.    { "eva
30600 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
30610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76 61       sqlite3_eva
30620 6c 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  l_init          
30630 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30640 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20  "fileio",       
30650 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30660 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20  _fileio_init    
30670 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30680 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20    { "fuzzer",   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
306a0 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74  ite3_fuzzer_init
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
306c0 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34  ,.    { "ieee754
306d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
306e0 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e   sqlite3_ieee_in
306f0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
30700 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78     },.    { "nex
30710 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20 20  tchar",         
30720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78       sqlite3_nex
30730 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20  tchar_init      
30740 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30750 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20  "percentile",   
30760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30770 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74  _percentile_init
30780 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30790 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20 20    { "regexp",   
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
307b0 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74  ite3_regexp_init
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
307d0 2c 0a 20 20 20 20 7b 20 22 72 65 6d 65 6d 62 65  ,.    { "remembe
307e0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
307f0 20 73 71 6c 69 74 65 33 5f 72 65 6d 65 6d 62 65   sqlite3_remembe
30800 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
30810 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65 72     },.    { "ser
30820 69 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ies",           
30830 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 72       sqlite3_ser
30840 69 65 73 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ies_init        
30850 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30860 22 73 70 65 6c 6c 66 69 78 22 2c 20 20 20 20 20  "spellfix",     
30870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30880 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20  _spellfix_init  
30890 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
308a0 20 20 7b 20 22 74 6f 74 79 70 65 22 2c 20 20 20    { "totype",   
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
308c0 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74  ite3_totype_init
308d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
308e0 2c 0a 20 20 20 20 7b 20 22 75 6e 69 6f 6e 76 74  ,.    { "unionvt
308f0 61 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ab",            
30900 20 73 71 6c 69 74 65 33 5f 75 6e 69 6f 6e 76 74   sqlite3_unionvt
30910 61 62 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ab_init         
30920 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 68 6f     },.    { "who
30930 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  lenumber",      
30940 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 68 6f       sqlite3_who
30950 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 20 20 20  lenumber_init   
30960 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
30970 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
30980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
30990 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72  e;.  int i, j, r
309a0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
309b0 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  sg = 0;.  if( ob
309c0 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<3 ){.    Tcl_
309d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
309e0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
309f0 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20  B NAME ...");.  
30a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30a10 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
30a20 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
30a30 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
30a40 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
30a50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
30a60 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a  OR;.  for(j=2; j
30a70 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <objc; j++){.   
30a80 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
30a90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b  String(objv[j]);
30aa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30ab0 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e  ArraySize(aExten
30ac0 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sion); i++){.   
30ad0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
30ae0 61 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b  ame, aExtension[
30af0 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20  i].zExtName)==0 
30b00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
30b10 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53     if( i>=ArrayS
30b20 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20  ize(aExtension) 
30b30 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
30b40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
30b50 2c 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e  , "no such exten
30b60 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20  sion: ", zName, 
30b70 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
30b80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30b90 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
30ba0 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
30bb0 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  Init ){.      rc
30bc0 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d   = aExtension[i]
30bd0 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  .pInit(db, &zErr
30be0 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Msg, 0);.    }el
30bf0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
30c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
30c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30c20 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67  TE_OK || zErrMsg
30c30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
30c40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
30c50 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69  p, "initializati
30c60 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20  on of ", zName, 
30c70 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72  " failed: ", zEr
30c80 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
30ca0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
30cb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
30cc0 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sg);.      retur
30cd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
30ce0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30cf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
30d00 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74       sorter_test
30d10 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a  _fakeheap BOOL.*
30d20 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
30d30 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f  SQLITE_TCLAPI so
30d40 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
30d50 61 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ap(.  void * cli
30d60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
30d70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
30d80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
30d90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
30da0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67  [].){.  int bArg
30db0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
30dc0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
30dd0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
30de0 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29  1, objv, "BOOL")
30df0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
30e00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
30e10 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
30e20 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
30e30 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29   objv[1], &bArg)
30e40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
30e50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
30e60 20 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20   if( bArg ){.   
30e70 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
30e80 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
30e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
30ea0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
30eb0 48 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  Heap = SQLITE_IN
30ec0 54 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20  T_TO_PTR(-1);.  
30ed0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
30ee0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
30ef0 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
30f00 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
30f10 52 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73  R(-1) ){.      s
30f20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
30f30 69 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20  ig.pHeap = 0;.  
30f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52    }.  }..  Tcl_R
30f50 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
30f60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
30f70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
30f80 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f    sorter_test_so
30f90 72 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51  rt4_helper DB SQ
30fa0 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a  L1 NSTEP SQL2.**
30fb0 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20  .** Compile SQL 
30fc0 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20  statement $SQL1 
30fd0 61 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53 54  and step it $NST
30fe0 45 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61  EP times. For ea
30ff0 63 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63  ch row, .** chec
31000 6b 20 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d  k that the leftm
31010 6f 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73  ost and rightmos
31020 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
31030 65 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65  ed are both inte
31040 67 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61  gers,.** and tha
31050 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74  t both contain t
31060 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a  he same value..*
31070 2a 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74  *.** Then execut
31080 65 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c  e statement $SQL
31090 32 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  2. Check that th
310a0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  e statement retu
310b0 72 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  rns the same.** 
310c0 73 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20  set of integers 
310d0 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
310e0 72 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76  r as in the prev
310f0 69 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e 67  ious step (using
31100 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74   $SQL1)..*/.stat
31110 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
31120 4c 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74  LAPI sorter_test
31130 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20  _sort4_helper(. 
31140 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
31150 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
31160 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
31170 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
31180 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
31190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
311a0 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Sql1;.  const ch
311b0 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74  ar *zSql2;.  int
311c0 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69   nStep; .  int i
311d0 53 74 65 70 3b 20 0a 20 20 75 6e 73 69 67 6e 65  Step; .  unsigne
311e0 64 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20  d int iCksum1 = 
311f0 30 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  0; .  unsigned i
31200 6e 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20  nt iCksum2 = 0; 
31210 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
31220 20 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   iB;.  sqlite3 *
31230 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  db;.  sqlite3_st
31240 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20  mt *pStmt;.  .  
31250 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
31260 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
31270 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
31280 62 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53  bjv, "DB SQL1 NS
31290 54 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20  TEP SQL2");.    
312a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
312b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
312c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
312d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
312e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
312f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31300 52 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c  R;.  zSql1 = Tcl
31310 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
31320 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
31330 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
31340 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
31350 53 74 65 70 29 20 29 20 72 65 74 75 72 6e 20 54  Step) ) return T
31360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
31370 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  2 = Tcl_GetStrin
31380 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72  g(objv[4]);..  r
31390 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
313a0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31  are_v2(db, zSql1
313b0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
313c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
313d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
313e0 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20  _error;..  iB = 
313f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
31400 6f 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20  ount(pStmt)-1;. 
31410 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53   for(iStep=0; iS
31420 74 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c  tep<nStep && SQL
31430 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
31440 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53  _step(pStmt); iS
31450 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  tep++){.    int 
31460 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  a = sqlite3_colu
31470 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
31480 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c  ;.    if( a!=sql
31490 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
314a0 70 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20  pStmt, iB) ){.  
314b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
314c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61  sult(interp, "da
314d0 74 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29  ta error: (a!=b)
314e0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
314f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
31500 20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d     }..    iCksum
31510 31 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c  1 += (iCksum1 <<
31520 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20   3) + (unsigned 
31530 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20  int)a;.  }.  rc 
31540 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
31550 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
31560 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31570 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
31580 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
31590 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
315a0 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d  zSql2, -1, &pStm
315b0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
315c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
315d0 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66  o sql_error;.  f
315e0 6f 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49  or(iStep=0; SQLI
315f0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
31600 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
31610 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
31620 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
31630 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
31640 0a 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20  .    iCksum2 += 
31650 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b  (iCksum2 << 3) +
31660 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61   (unsigned int)a
31670 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
31680 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
31690 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
316a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
316b0 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
316c0 66 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73  f( iCksum1!=iCks
316d0 75 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  um2 ){.    Tcl_A
316e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
316f0 72 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69  rp, "checksum mi
31700 73 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20  smatch", 0);.   
31710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31720 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
31730 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72   TCL_OK;. sql_er
31740 72 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ror:.  Tcl_Appen
31750 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
31760 22 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73  "sql error: ", s
31770 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
31780 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
31790 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23  TCL_ERROR;.}...#
317a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
317b0 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
317c0 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
317d0 65 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a  e3userauth.h"./*
317e0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
317f0 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
31800 74 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41  ticate DB USERNA
31810 4d 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73  ME PASSWORD.*/.s
31820 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
31830 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65  _TCLAPI test_use
31840 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 0a  r_authenticate(.
31850 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
31860 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
31870 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
31880 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
31890 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
318a0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
318b0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
318c0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
318d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
318e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
318f0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
31900 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
31910 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
31920 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
31930 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63   *zUser = 0;.  c
31940 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30  har *zPasswd = 0
31950 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20  ;.  int nPasswd 
31960 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
31970 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
31980 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
31990 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
319a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
319b0 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41  objv, "DB USERNA
319c0 4d 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a 20  ME PASSWORD");. 
319d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
319e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
319f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
31a00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
31a10 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
31a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
31a30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
31a40 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
31a50 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
31a60 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
31a70 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
31a80 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
31a90 77 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  wd);.  rc = sqli
31aa0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
31ab0 69 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72 2c  icate(db, zUser,
31ac0 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77   zPasswd, nPassw
31ad0 64 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  d);.  Tcl_SetRes
31ae0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
31af0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
31b00 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
31b10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
31b20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
31b30 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
31b40 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  NTICATION */..#i
31b50 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
31b60 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
31b70 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
31b80 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20  qlite3_user_add 
31b90 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
31ba0 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a  WORD ISADMIN.*/.
31bb0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
31bc0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73  E_TCLAPI test_us
31bd0 65 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74  er_add(.  Client
31be0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
31bf0 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
31c00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31c10 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
31c20 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
31c30 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
31c40 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
31c50 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
31c60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31c70 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
31c80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
31c90 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
31ca0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
31cb0 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
31cc0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
31cd0 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
31ce0 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  nPasswd = 0;.  i
31cf0 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a  nt isAdmin = 0;.
31d00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
31d10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
31d20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
31d30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
31d40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
31d50 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41   "DB USERNAME PA
31d60 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29  SSWORD ISADMIN")
31d70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
31d80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
31d90 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
31da0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
31db0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
31dc0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
31dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
31de0 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
31df0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
31e00 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54  );.  zPasswd = T
31e10 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
31e20 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50  Obj(objv[3], &nP
31e30 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65  asswd);.  Tcl_Ge
31e40 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
31e50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
31e60 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63   &isAdmin);.  rc
31e70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
31e80 61 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  add(db, zUser, z
31e90 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
31ea0 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
31eb0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
31ec0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
31ed0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
31ee0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
31ef0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
31f00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
31f10 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
31f20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
31f30 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
31f40 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
31f50 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
31f60 65 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45  er_change DB USE
31f70 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
31f80 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
31f90 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
31fa0 50 49 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61  PI test_user_cha
31fb0 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  nge(.  ClientDat
31fc0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
31fd0 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
31fe0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
31ff0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
32000 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
32010 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
32020 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
32030 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
32040 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
32050 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
32060 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
32070 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
32080 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
32090 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
320a0 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
320b0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
320c0 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
320d0 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73  isAdmin = 0;.  s
320e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
320f0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
32100 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
32110 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
32120 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
32130 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
32140 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20  ORD ISADMIN");. 
32150 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32160 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
32170 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
32180 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
32190 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
321a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
321b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
321c0 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
321d0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
321e0 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
321f0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
32200 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
32210 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f  wd);.  Tcl_GetBo
32220 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
32230 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69  erp, objv[4], &i
32240 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20  sAdmin);.  rc = 
32250 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
32260 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  nge(db, zUser, z
32270 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
32280 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
32290 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
322a0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
322b0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
322c0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
322d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
322e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
322f0 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
32300 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
32310 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
32320 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
32330 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
32340 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45  er_delete DB USE
32350 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20  RNAME.*/.static 
32360 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
32370 49 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  I test_user_dele
32380 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
32390 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
323a0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
323b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
323c0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
323d0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
323e0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
323f0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
32400 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
32410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
32420 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
32430 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
32440 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
32450 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
32460 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
32470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
32480 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
32490 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
324a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
324b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
324c0 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
324d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
324e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
324f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
32500 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
32510 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
32520 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
32530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
32540 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
32550 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
32560 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
32570 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
32580 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
32590 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
325a0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
325b0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
325c0 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
325d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
325e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
325f0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
32600 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
32610 3a 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54  : bad_behavior T
32620 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d  YPE.**.** Do som
32630 65 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68  e things that sh
32640 6f 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76  ould trigger a v
32650 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e  algrind or -fsan
32660 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a  itize=undefined.
32670 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69  ** warning.  Thi
32680 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72  s is used to ver
32690 69 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20  ify that errors 
326a0 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74  and warnings out
326b0 70 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20  put by those.** 
326c0 74 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74  tools are detect
326d0 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
326e0 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cripts..**.**   
326f0 20 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42      TYPE       B
32700 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20  EHAVIOR.**      
32710 20 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72   1          Over
32720 66 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e  flow a signed in
32730 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32  teger.**       2
32740 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62            Jump b
32750 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  ased on an unini
32760 74 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c  tialized variabl
32770 65 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20  e.**       3    
32780 20 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72        Read after
32790 20 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34   free.**       4
327a0 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a            Panic.
327b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
327c0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
327d0 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20  _bad_behavior(. 
327e0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
327f0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
32800 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
32810 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
32820 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
32830 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
32840 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
32850 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
32860 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
32870 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
32880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32890 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
328a0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
328b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
328c0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
328d0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54  s */.){.  int iT
328e0 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a  ype;.  int xyz;.
328f0 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a    int i = *(int*
32900 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
32910 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30  nt j;.  int w[10
32920 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69  ];.  int *a;.  i
32930 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
32940 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
32950 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
32960 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20  jv, "TYPE");.   
32970 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32980 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
32990 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
329a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
329b0 26 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e  &iType) ) return
329c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77   TCL_ERROR;.  sw
329d0 69 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20  itch( iType ){. 
329e0 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
329f0 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66     xyz = 0x7ffff
32a00 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78  f00 - i;.      x
32a10 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20  yz += 0x100;.   
32a20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
32a30 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
32a40 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b  NewIntObj(xyz));
32a50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32a60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
32a70 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35  {.      w[1] = 5
32a80 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d  ;.      if( w[i]
32a90 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20  >0 ) w[1]++;.   
32aa0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
32ab0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
32ac0 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29  NewIntObj(w[1]))
32ad0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32ae0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
32af0 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c   {.      a = mal
32b00 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29  loc( sizeof(int)
32b10 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  *10 );.      for
32b20 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29  (j=0; j<10; j++)
32b30 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20   a[j] = j;.     
32b40 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20   free(a);.      
32b50 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
32b60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
32b70 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20  IntObj(a[i]));. 
32b80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32b90 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  }.    case 4: {.
32ba0 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28        Tcl_Panic(
32bb0 22 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69  "Deliberate pani
32bc0 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  c");.      break
32bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
32be0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20  turn TCL_OK;.}  
32bf0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
32c00 20 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61    register_dbsta
32c10 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20  t_vtab DB.**.** 
32c20 43 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74  Cause the dbstat
32c30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
32c40 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  o be available o
32c50 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
32c60 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
32c70 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
32c80 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62  test_register_db
32c90 73 74 61 74 5f 76 74 61 62 28 0a 20 20 76 6f 69  stat_vtab(.  voi
32ca0 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
32cb0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
32cc0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
32cd0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
32ce0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64  T objv[].){.#ifd
32cf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
32d00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 54 63  IRTUALTABLE.  Tc
32d10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
32d20 6e 74 65 72 70 2c 20 22 64 62 73 74 61 74 20 6e  nterp, "dbstat n
32d30 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 62 65 63  ot available bec
32d40 61 75 73 65 20 6f 66 20 22 0a 20 20 20 20 20 20  ause of ".      
32d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d60 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49       "SQLITE_OMI
32d70 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c  T_VIRTUALTABLE",
32d80 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65   (void*)0);.  re
32d90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
32da0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 53  #else.  struct S
32db0 71 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65  qliteDb { sqlite
32dc0 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61 72  3 *db; };.  char
32dd0 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d 64   *zDb;.  Tcl_Cmd
32de0 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20  Info cmdInfo;.. 
32df0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
32e00 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
32e10 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
32e20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
32e30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32e40 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d 20  R;.  }..  zDb = 
32e50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
32e60 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[1]);.  if( Tc
32e70 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
32e80 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
32e90 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 73  mdInfo) ){.    s
32ea0 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 28 28 73  qlite3* db = ((s
32eb0 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
32ec0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
32ed0 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20 20  tData)->db;.    
32ee0 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
32ef0 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20  ister(db);.  }. 
32f00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
32f10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
32f20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
32f30 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  LE */.}../*.** t
32f40 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
32f50 5f 64 62 5f 63 6f 6e 66 69 67 20 44 42 20 53 45  _db_config DB SE
32f60 54 54 49 4e 47 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TTING VALUE.**.*
32f70 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
32f80 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 66 6f 72  _db_config() for
32f90 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 74 74   one of the sett
32fa0 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ing values..*/.s
32fb0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
32fc0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
32fd0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a  ite3_db_config(.
32fe0 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
32ff0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
33000 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
33010 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
33020 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
33030 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
33040 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
33050 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
33060 20 20 20 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20      int eVal;.  
33070 7d 20 61 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b  } aSetting[] = {
33080 0a 20 20 20 20 7b 20 22 46 4b 45 59 22 2c 20 20  .    { "FKEY",  
33090 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
330a0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
330b0 5f 46 4b 45 59 20 7d 2c 0a 20 20 20 20 7b 20 22  _FKEY },.    { "
330c0 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
330d0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
330e0 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
330f0 20 7d 2c 0a 20 20 20 20 7b 20 22 46 54 53 33 5f   },.    { "FTS3_
33100 54 4f 4b 45 4e 49 5a 45 52 22 2c 20 20 53 51 4c  TOKENIZER",  SQL
33110 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
33120 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
33130 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 4c 4f 41  ER },.    { "LOA
33140 44 5f 45 58 54 45 4e 53 49 4f 4e 22 2c 20 20 53  D_EXTENSION",  S
33150 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
33160 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
33170 53 49 4f 4e 20 7d 2c 0a 20 20 20 20 7b 20 22 4e  SION },.    { "N
33180 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 22  O_CKPT_ON_CLOSE"
33190 2c 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47  ,SQLITE_DBCONFIG
331a0 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53  _NO_CKPT_ON_CLOS
331b0 45 20 7d 2c 0a 20 20 20 20 7b 20 22 51 50 53 47  E },.    { "QPSG
331c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
331d0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
331e0 41 42 4c 45 5f 51 50 53 47 20 7d 2c 0a 20 20 7d  ABLE_QPSG },.  }
331f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
33200 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   v;.  const char
33210 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73 71   *zSetting;.  sq
33220 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
33230 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
33240 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
33250 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
33260 76 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20 56  v, "DB SETTING V
33270 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ALUE");.    retu
33280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
33290 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
332a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
332b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
332c0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
332d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
332e0 7a 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f 47  zSetting = Tcl_G
332f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
33300 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
33310 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54 45  _strglob("SQLITE
33320 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d 3d  _*", zSetting)==
33330 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d 20  0 ) zSetting += 
33340 37 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  7;.  if( sqlite3
33350 5f 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e 46  _strglob("DBCONF
33360 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29  IG_*", zSetting)
33370 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b  ==0 ) zSetting +
33380 3d 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 9;.  if( sqlit
33390 65 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41 42  e3_strglob("ENAB
333a0 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29  LE_*", zSetting)
333b0 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b  ==0 ) zSetting +
333c0 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 7;.  for(i=0; 
333d0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65 74  i<ArraySize(aSet
333e0 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ting); i++){.   
333f0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 74   if( strcmp(zSet
33400 74 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b 69  ting, aSetting[i
33410 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
33420 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
33430 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65 74  >=ArraySize(aSet
33440 74 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63 6c  ting) ){.    Tcl
33450 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
33460 74 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c 5f  terp,.      Tcl_
33470 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e  NewStringObj("un
33480 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64 62  known sqlite3_db
33490 5f 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67 22  _config setting"
334a0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
334b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
334c0 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
334d0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
334e0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20 29  , objv[3], &v) )
334f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
33500 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  R;.  sqlite3_db_
33510 63 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74 74  config(db, aSett
33520 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c 20  ing[i].eVal, v, 
33530 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  &v);.  Tcl_SetOb
33540 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
33550 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
33560 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
33570 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
33580 6e 67 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  nge the name of 
33590 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
335a0 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 22 6d  e schema from "m
335b0 61 69 6e 22 20 74 6f 20 22 69 63 65 63 75 62 65  ain" to "icecube
335c0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
335d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
335e0 65 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d 61 69  est_dbconfig_mai
335f0 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 28  ndbname_icecube(
33600 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
33610 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
33620 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
33630 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
33640 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
33650 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
33660 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 65 78  qlite3 *db;.  ex
33670 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f  tern int getDbPo
33680 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70  inter(Tcl_Interp
33690 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
336a0 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 69 66  sqlite3**);.  if
336b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
336c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
336d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
336e0 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
336f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
33700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33710 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
33720 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
33730 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
33740 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
33750 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20  ERROR;.    rc = 
33760 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
33770 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
33780 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
33790 2c 20 22 69 63 65 63 75 62 65 22 29 3b 0a 20 20  , "icecube");.  
337a0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
337b0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
337c0 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
337d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
337e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
337f0 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
33800 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
33810 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
33820 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
33830 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
33840 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
33850 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
33860 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
33870 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
33880 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65  found_count;.  e
33890 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
338a0 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
338b0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
338c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
338d0 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
338e0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f  n int sqlite3_so
338f0 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  rt_count;.  exte
33900 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
33910 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66  urrent_time;.#if
33920 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
33930 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
33940 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
33950 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33960 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  TYLE.  extern in
33970 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
33980 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65  _num;.#endif.  e
33990 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
339a0 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a  3_max_blobsize;.
339b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 51 4c    extern int SQL
339c0 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74  ITE_TCLAPI sqlit
339d0 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
339e0 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a  heReport(void*,.
339f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a10 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
33a20 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62  terp*,int,Tcl_Ob
33a30 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61  j*CONST*);.  sta
33a40 74 69 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20  tic int iZero = 
33a50 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
33a60 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
33a70 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
33a80 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
33a90 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
33aa0 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22      { "db_enter"
33ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33ac0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33ad0 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20  roc*)db_enter   
33ae0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
33af0 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22      { "db_leave"
33b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33b10 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33b20 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20  roc*)db_leave   
33b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
33b40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33b50 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
33b60 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33b70 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33b80 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20  intf_int    },. 
33b90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33ba0 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20  printf_int64",  
33bb0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33bc0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33bd0 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20  intf_int64  },. 
33be0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33bf0 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20  printf_long",   
33c00 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33c10 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33c20 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20  intf_long   },. 
33c30 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33c40 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
33c50 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33c60 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33c70 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20  intf_str    },. 
33c80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
33c90 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  nprintf_str",   
33ca0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33cb0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70  roc*)sqlite3_snp
33cc0 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20  rintf_str   },. 
33cd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33ce0 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c  printf_stronly",
33cf0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33d00 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33d10 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20  intf_stronly},. 
33d20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33d30 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20  printf_double", 
33d40 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33d50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33d60 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20  intf_double },. 
33d70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33d80 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20  printf_scaled", 
33d90 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33da0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
33db0 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20  intf_scaled },. 
33dc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33dd0 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
33de0 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  ",   (Tcl_CmdPro
33df0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
33e00 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20  tf_hexdouble},. 
33e10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
33e20 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20  printf_z_test", 
33e30 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
33e40 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
33e50 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_z        },.  
33e60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
33e70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20  rintf_n_test",  
33e80 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
33e90 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
33ea0 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _n        },.   
33eb0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70    { "sqlite3_snp
33ec0 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
33ed0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
33ee0 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  c*)test_snprintf
33ef0 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  _int     },.    
33f00 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74   { "sqlite3_last
33f10 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
33f20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
33f30 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  *)test_last_rowi
33f40 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
33f50 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
33f60 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
33f70 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
33f80 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74  )test_exec_print
33f90 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  f      },.     {
33fa0 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   "sqlite3_exec_h
33fb0 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ex",            
33fc0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
33fd0 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20  test_exec_hex   
33fe0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
33ff0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20  "sqlite3_exec", 
34000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34010 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
34020 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20  est_exec        
34030 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
34040 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22  sqlite3_exec_nr"
34050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34060 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34070 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20  st_exec_nr      
34080 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
34090 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54  QLITE_OMIT_GET_T
340a0 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ABLE.     { "sql
340b0 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
340c0 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63  rintf",      (Tc
340d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
340e0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
340f0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
34100 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  { "sqlite3_close
34110 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34120 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
34130 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f  )sqlite_test_clo
34140 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  se     },.     {
34150 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f   "sqlite3_close_
34160 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
34170 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
34180 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
34190 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e_v2  },.     { 
341a0 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
341b0 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
341c0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
341d0 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
341e0 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ion  },.     { "
341f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
34200 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20  ggregate",      
34210 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34220 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
34230 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ate },.     { "s
34240 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
34250 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28  est_function", (
34260 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
34270 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20  t_register_func 
34280 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
34290 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20  lite_abort",    
342a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
342b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
342c0 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20  te_abort        
342d0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
342e0 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20  ite_bind",      
342f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
34300 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
34310 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  bind            
34320 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61   },.     { "brea
34330 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  kpoint",        
34340 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
34350 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
34360 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20  reakpoint       
34370 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34380 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20  e3_key",        
34390 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
343a0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65  CmdProc*)test_ke
343b0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  y              }
343c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
343d0 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20  3_rekey",       
343e0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
343f0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b  mdProc*)test_rek
34400 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ey            },
34410 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
34420 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20  set_magic",     
34430 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
34440 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65  dProc*)sqlite_se
34450 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a  t_magic      },.
34460 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34470 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20  interrupt",     
34480 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
34490 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72  Proc*)test_inter
344a0 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  rupt        },. 
344b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
344c0 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  lete_function", 
344d0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
344e0 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63  roc*)delete_func
344f0 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20  tion       },.  
34500 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
34510 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20  ete_collation", 
34520 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
34530 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  oc*)delete_colla
34540 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20  tion      },.   
34550 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
34560 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20  _autocommit",   
34570 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
34580 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  c*)get_autocommi
34590 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
345a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79   { "sqlite3_busy
345b0 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20  _timeout",      
345c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
345d0 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65  *)test_busy_time
345e0 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  out     },.     
345f0 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20  { "printf",     
34600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34610 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
34620 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20  )test_printf    
34630 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
34640 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   "sqlite3IoTrace
34650 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34660 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34670 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20  st_io_trace     
34680 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63      },.     { "c
34690 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64  lang_sanitize_ad
346a0 64 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 28  dress",        (
346b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61  Tcl_CmdProc*)cla
346c0 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
346d0 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  ess },.  };.  st
346e0 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
346f0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
34700 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50       Tcl_ObjCmdP
34710 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20  roc *xProc;.    
34720 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
34730 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d  a;.  } aObjCmd[]
34740 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c   = {.     { "sql
34750 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c  ite3_db_config",
34760 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
34770 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t_sqlite3_db_con
34780 66 69 67 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  fig, 0 },.     {
34790 20 22 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c   "bad_behavior",
347a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347b0 20 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76    test_bad_behav
347c0 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a  ior,  (void*)&iZ
347d0 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  ero },.     { "r
347e0 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76  egister_dbstat_v
347f0 74 61 62 22 2c 20 20 20 20 20 20 20 20 20 20 74  tab",          t
34800 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73  est_register_dbs
34810 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20  tat_vtab  },.   
34820 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e    { "sqlite3_con
34830 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22  nection_pointer"
34840 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f  ,    get_sqlite_
34850 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20  pointer, 0 },.  
34860 20 20 20 7b 20 22 69 6e 74 61 72 72 61 79 5f 61     { "intarray_a
34870 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ddr",           
34880 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 61 72        test_intar
34890 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20  ray_addr, 0 },. 
348a0 20 20 20 20 7b 20 22 69 6e 74 36 34 61 72 72 61      { "int64arra
348b0 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20  y_addr",        
348c0 20 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 36         test_int6
348d0 34 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d  4array_addr, 0 }
348e0 2c 0a 20 20 20 20 20 7b 20 22 64 6f 75 62 6c 65  ,.     { "double
348f0 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20  array_addr",    
34900 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
34910 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 2c  oublearray_addr,
34920 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65   0 },.     { "te
34930 78 74 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20  xtarray_addr",  
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
34950 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64  st_textarray_add
34960 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r, 0 },.     { "
34970 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
34980 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34990 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20  test_bind_int,  
349a0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
349b0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
349c0 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  roblob",        
349d0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
349e0 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  lob, 0 },.     {
349f0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a   "sqlite3_bind_z
34a00 65 72 6f 62 6c 6f 62 36 34 22 2c 20 20 20 20 20  eroblob64",     
34a10 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f    test_bind_zero
34a20 62 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20  blob64, 0 },.   
34a30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
34a40 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  d_int64",       
34a50 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
34a60 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20  nt64,    0 },.  
34a70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
34a80 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  nd_double",     
34a90 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
34aa0 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20  double,   0 },. 
34ab0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
34ac0 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20  ind_null",      
34ad0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
34ae0 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a  _null     ,0 },.
34af0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34b00 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20  bind_text",     
34b10 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
34b20 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c  d_text     ,0 },
34b30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34b40 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20  _bind_text16",  
34b50 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
34b60 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d  nd_text16   ,0 }
34b70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34b80 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20  3_bind_blob",   
34b90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
34ba0 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20  ind_blob     ,0 
34bb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34bc0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
34bd0 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f  r_count",  test_
34be0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
34bf0 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ount, 0},.     {
34c00 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
34c10 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20  arameter_name", 
34c20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
34c30 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c  meter_name,  0},
34c40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34c50 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
34c60 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69  index",  test_bi
34c70 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
34c80 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ex, 0},.     { "
34c90 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
34ca0 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20  ndings",        
34cb0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
34cc0 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  ngs, 0},.     { 
34cd0 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c  "sqlite3_sleep",
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cf0 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20   test_sleep,    
34d00 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
34d10 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
34d20 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
34d30 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
34d40 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
34d50 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
34d60 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  ded_errcode",   
34d70 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f     test_ex_errco
34d80 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  de    ,0 },.    
34d90 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
34da0 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
34db0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
34dc0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
34dd0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
34de0 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
34df0 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
34e00 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
34e10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
34e20 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
34e30 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
34e40 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
34e50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
34e60 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
34e70 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
34e80 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
34e90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34ea0 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20  open_v2",       
34eb0 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
34ec0 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c  n_v2       ,0 },
34ed0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34ee0 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20  _complete16",   
34ef0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
34f00 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d  mplete16    ,0 }
34f10 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
34f20 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
34f30 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
34f40 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
34f50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
34f60 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
34f70 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
34f80 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
34f90 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
34fa0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
34fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
34fc0 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
34fd0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
34fe0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
34ff0 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65  t3134",       te
35000 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
35010 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  34, 0},.     { "
35020 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
35030 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  6_v2",          
35040 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
35050 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  2  ,0 },.     { 
35060 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  "sqlite3_finaliz
35070 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
35080 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20   test_finalize  
35090 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
350a0 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73   "sqlite3_stmt_s
350b0 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
350c0 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74    test_stmt_stat
350d0 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  us   ,0 },.     
350e0 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  { "sqlite3_reset
350f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
35100 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20     test_reset   
35110 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
35120 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69   { "sqlite3_expi
35130 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  red",           
35140 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64      test_expired
35150 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
35160 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61    { "sqlite3_tra
35170 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c  nsfer_bindings",
35180 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66       test_transf
35190 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20  er_bind ,0 },.  
351a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68     { "sqlite3_ch
351b0 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
351c0 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67        test_chang
351d0 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  es       ,0 },. 
351e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
351f0 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  tep",           
35200 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70         test_step
35210 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
35220 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35230 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  sql",           
35240 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
35250 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c             ,0 },
35260 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35270 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20  _expanded_sql", 
35280 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78           test_ex
35290 5f 73 71 6c 20 20 20 20 20 20 20 20 2c 30 20 7d  _sql        ,0 }
352a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
352b0 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
352c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
352d0 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
352e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
352f0 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
35300 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
35310 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30  stmt_readonly ,0
35320 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35330 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20  te3_stmt_busy", 
35340 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
35350 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c  _stmt_busy     ,
35360 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35370 69 74 65 33 5f 73 74 6d 74 5f 72 65 66 72 65 73  ite3_stmt_refres
35380 68 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  h",          tes
35390 74 5f 73 74 6d 74 5f 72 65 66 72 65 73 68 20 20  t_stmt_refresh  
353a0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73  ,0 },.     { "us
353b0 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22  es_stmt_journal"
353c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ,             us
353d0 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
353e0 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
353f0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
35400 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74  emory",        t
35410 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
35420 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ry,     0},.    
35430 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72   { "sqlite3_db_r
35440 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20  elease_memory", 
35450 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65      test_db_rele
35460 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c  ase_memory,  0},
35470 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35480 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 22 2c  _db_cacheflush",
35490 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62           test_db
354a0 5f 63 61 63 68 65 66 6c 75 73 68 2c 20 20 20 20  _cacheflush,    
354b0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
354c0 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
354d0 6e 6f 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  no",          te
354e0 73 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 2c  st_system_errno,
354f0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
35500 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  { "sqlite3_db_fi
35510 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20  lename",        
35520 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e     test_db_filen
35530 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  ame,        0},.
35540 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35550 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20  db_readonly",   
35560 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
35570 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20  readonly,       
35580 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
35590 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
355a0 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65 73  imit",       tes
355b0 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
355c0 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  t,    0},.     {
355d0 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64   "sqlite3_thread
355e0 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20  _cleanup",      
355f0 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c    test_thread_cl
35600 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20  eanup,     0},. 
35610 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
35620 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c  ager_refcounts",
35630 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65         test_page
35640 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20  r_refcounts,    
35650 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c  0},..     { "sql
35660 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
35670 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73  ion",        tes
35680 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
35690 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
356a0 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
356b0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
356c0 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  , test_enable_lo
356d0 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ad,        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 72 65 73 75 6c 74 5f 63  xtended_result_c
35700 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65  odes", test_exte
35710 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
35720 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
35730 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20  qlite3_limit",  
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
35750 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20  est_limit,      
35760 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20             0},. 
35770 20 20 20 20 7b 20 22 64 62 63 6f 6e 66 69 67 5f      { "dbconfig_
35780 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75  maindbname_icecu
35790 62 65 22 2c 20 20 20 74 65 73 74 5f 64 62 63 6f  be",   test_dbco
357a0 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f  nfig_maindbname_
357b0 69 63 65 63 75 62 65 20 7d 2c 0a 0a 20 20 20 20  icecube },..    
357c0 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74   { "save_prng_st
357d0 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
357e0 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74      save_prng_st
357f0 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  ate,    0 },.   
35800 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70 72 6e    { "restore_prn
35810 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
35820 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72 6e       restore_prn
35830 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20  g_state, 0 },.  
35840 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72 6e 67     { "reset_prng
35850 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
35860 20 20 20 20 20 20 72 65 73 65 74 5f 70 72 6e 67        reset_prng
35870 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20  _state,   0 },. 
35880 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f      { "database_
35890 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22 2c 20  never_corrupt", 
358a0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 5f         database_
358b0 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 2c 20 30  never_corrupt, 0
358c0 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62  },.     { "datab
358d0 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75  ase_may_be_corru
358e0 70 74 22 2c 20 20 20 20 20 20 20 64 61 74 61 62  pt",       datab
358f0 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75  ase_may_be_corru
35900 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  pt, 0},.     { "
35910 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
35920 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20  trol",          
35930 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
35940 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c  trol,0},.#if SQL
35950 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20  ITE_OS_WIN.     
35960 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69  { "lock_win32_fi
35970 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
35980 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f     win32_file_lo
35990 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ck,    0 },.    
359a0 20 7b 20 22 65 78 69 73 74 73 5f 77 69 6e 33 32   { "exists_win32
359b0 5f 70 61 74 68 22 2c 20 20 20 20 20 20 20 20 20  _path",         
359c0 20 20 20 20 77 69 6e 33 32 5f 65 78 69 73 74 73      win32_exists
359d0 5f 70 61 74 68 2c 20 20 30 20 7d 2c 0a 20 20 20  _path,  0 },.   
359e0 20 20 7b 20 22 66 69 6e 64 5f 77 69 6e 33 32 5f    { "find_win32_
359f0 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
35a00 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6e 64 5f       win32_find_
35a10 66 69 6c 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20  file,    0 },.  
35a20 20 20 20 7b 20 22 64 65 6c 65 74 65 5f 77 69 6e     { "delete_win
35a30 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20  32_file",       
35a40 20 20 20 20 20 20 77 69 6e 33 32 5f 64 65 6c 65        win32_dele
35a50 74 65 5f 66 69 6c 65 2c 20 20 30 20 7d 2c 0a 20  te_file,  0 },. 
35a60 20 20 20 20 7b 20 22 6d 61 6b 65 5f 77 69 6e 33      { "make_win3
35a70 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20  2_dir",         
35a80 20 20 20 20 20 20 20 77 69 6e 33 32 5f 6d 6b 64         win32_mkd
35a90 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ir,        0 },.
35aa0 20 20 20 20 20 7b 20 22 72 65 6d 6f 76 65 5f 77       { "remove_w
35ab0 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20  in32_dir",      
35ac0 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 72 6d          win32_rm
35ad0 64 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  dir,        0 },
35ae0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
35af0 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20  tcl_objproc",   
35b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b10 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20  runAsObjProc,   
35b20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f      0 },..     /
35b30 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
35b40 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20  _*() API */.    
35b50 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
35b60 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  mn_count",      
35b70 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
35b80 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20  count  ,0 },.   
35b90 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74    { "sqlite3_dat
35ba0 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  a_count",       
35bb0 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63       test_data_c
35bc0 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ount    ,0 },.  
35bd0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
35be0 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20  lumn_type",     
35bf0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
35c00 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20  n_type   ,0 },. 
35c10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
35c20 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20  olumn_blob",    
35c30 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
35c40 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a  mn_blob   ,0 },.
35c50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35c60 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20  column_double", 
35c70 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
35c80 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c  umn_double ,0 },
35c90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35ca0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20  _column_int64", 
35cb0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
35cc0 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d  lumn_int64  ,0 }
35cd0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35ce0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
35cf0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
35d00 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
35d10 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c  3_column_text },
35d20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35d30 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
35d40 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
35d50 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
35d60 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a  _column_name },.
35d70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35d80 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
35d90 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
35da0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
35db0 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20  column_int  },. 
35dc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
35dd0 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74  olumn_bytes",  t
35de0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
35df0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
35e00 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69  olumn_bytes},.#i
35e10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35e20 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
35e30 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
35e40 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74  n_decltype",test
35e50 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
35e60 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
35e70 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64  _decltype},.#end
35e80 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
35e90 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
35ea0 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74  ETADATA.{ "sqlit
35eb0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
35ec0 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  se_name",test_st
35ed0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
35ee0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
35ef0 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  tabase_name},.{ 
35f00 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
35f10 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74  table_name",test
35f20 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
35f30 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
35f40 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  _table_name},.{ 
35f50 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
35f60 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73  origin_name",tes
35f70 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
35f80 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
35f90 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a  n_origin_name},.
35fa0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
35fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
35fc0 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  6.     { "sqlite
35fd0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
35fe0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ", test_stmt_int
35ff0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
36000 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
36010 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36020 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
36030 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
36040 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
36050 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
36060 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
36070 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
36080 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
36090 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
360a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
360b0 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64  16},.     { "add
360c0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
360d0 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64  collations", add
360e0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
360f0 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20  collations, 0   
36100 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
36110 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
36120 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
36130 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
36140 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f  pe16",test_stmt_
36150 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c  utf16,(void*)sql
36160 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
36170 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  type16},.#endif.
36180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
36190 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
361a0 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63  DATA.{"sqlite3_c
361b0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
361c0 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73  ame16",.  test_s
361d0 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
361e0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
361f0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
36200 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  },.{"sqlite3_col
36210 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36  umn_table_name16
36220 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
36230 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
36240 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
36250 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
36260 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
36270 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
36280 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
36290 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
362a0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c  _origin_name16},
362b0 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
362c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
362d0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
362e0 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
362f0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30  _collation_v2, 0
36300 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36310 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
36320 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c  er",     test_gl
36330 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20  obal_recover, 0 
36340 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72    },.     { "wor
36350 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c  king_64bit_int",
36360 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e            workin
36370 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30  g_64bit_int,   0
36380 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
36390 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20  s_unlink_test", 
363a0 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 75             vfs_u
363b0 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20  nlink_test,     
363c0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
363d0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
363e0 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73 5f  ",          vfs_
363f0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20 20  initfail_test,  
36400 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
36410 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
36420 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66 73  ll",         vfs
36430 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c  _unregister_all,
36440 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
36450 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f  "vfs_reregister_
36460 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
36470 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
36480 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
36490 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
364a0 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 66  est",          f
364b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
364c0 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
364d0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
364e0 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c  lasterrno_test",
364f0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
36500 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30  sterrno_test,  0
36510 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
36520 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
36530 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69 6c 65  roxy_test", file
36540 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
36550 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  xy_test,  0   },
36560 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
36570 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
36580 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
36590 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
365a0 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
365b0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
365c0 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 22 2c  _sizehint_test",
365d0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
365e0 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20 20 20  izehint_test,   
365f0 30 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54  0   },.#if SQLIT
36600 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20  E_OS_WIN.     { 
36610 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69  "file_control_wi
36620 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c 20 66  n32_av_retry", f
36630 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
36640 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30 20 20  2_av_retry,  0  
36650 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
36660 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67  _control_win32_g
36670 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69 6c 65  et_handle", file
36680 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67  _control_win32_g
36690 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20 7d 2c  et_handle, 0  },
366a0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
366b0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
366c0 68 61 6e 64 6c 65 22 2c 20 66 69 6c 65 5f 63 6f  handle", file_co
366d0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
366e0 68 61 6e 64 6c 65 2c 20 30 20 20 7d 2c 0a 23 65  handle, 0  },.#e
366f0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 66 69 6c  ndif.     { "fil
36700 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
36710 74 5f 77 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f  t_wal",    file_
36720 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
36730 77 61 6c 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  wal,     0   },.
36740 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
36750 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
36760 76 65 72 77 72 69 74 65 22 2c 66 69 6c 65 5f 63  verwrite",file_c
36770 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
36780 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d 2c 0a 20  _overwrite,0},. 
36790 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
367a0 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c 20 20 20  rol_vfsname",   
367b0 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f       file_contro
367c0 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20 20 20 20  l_vfsname,      
367d0 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
367e0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
367f0 65 6d 70 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  empfilename",   
36800 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
36810 70 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 30 20  pfilename,    0 
36820 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36830 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20  ite3_vfs_list", 
36840 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69            vfs_li
36850 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
36860 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
36870 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
36880 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f  2", test_create_
36890 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d  function_v2, 0 }
368a0 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
368b0 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
368c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
368d0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
368e0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
368f0 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
36900 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
36910 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36920 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
36930 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
36940 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
36950 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
36960 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
36970 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
36980 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
36990 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
369a0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 75 74 66   { "add_test_utf
369b0 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20  16bin_collate", 
369c0 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e     test_utf16bin
369d0 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
369e0 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20     },.#endif.   
369f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73    { "sqlite3_tes
36a00 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74  t_errstr",     t
36a10 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20  est_errstr, 0   
36a20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
36a30 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c    { "tcl_variabl
36a40 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74  e_type",       t
36a50 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
36a60 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66  , 0       },.#if
36a70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36a80 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
36a90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
36aa0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
36ab0 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  e", test_enable_
36ac0 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20  shared, 0  },.  
36ad0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68     { "sqlite3_sh
36ae0 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72  ared_cache_repor
36af0 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  t", sqlite3Btree
36b00 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
36b10 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  t, 0},.#endif.  
36b20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
36b30 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22  bversion_number"
36b40 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  , test_libversio
36b50 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a  n_number, 0  },.
36b60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36b70 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
36b80 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62  adata", test_tab
36b90 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
36ba0 74 61 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  ta, 0  },.#ifnde
36bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
36bc0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
36bd0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
36be0 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 72  en", test_blob_r
36bf0 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a 23 65 6e  eopen, 0  },.#en
36c00 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63  dif.     { "pcac
36c10 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20  he_stats",      
36c20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
36c30 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  ts, 0  },.#ifdef
36c40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
36c50 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20  NLOCK_NOTIFY.   
36c60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c    { "sqlite3_unl
36c70 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73  ock_notify", tes
36c80 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c  t_unlock_notify,
36c90 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
36ca0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
36cb0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20  l_checkpoint",  
36cc0 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70   test_wal_checkp
36cd0 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20  oint, 0  },.    
36ce0 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
36cf0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74  checkpoint_v2",t
36d00 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
36d10 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20  nt_v2, 0  },.   
36d20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c    { "sqlite3_wal
36d30 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22  _autocheckpoint"
36d40 2c 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68  ,test_wal_autoch
36d50 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a  eckpoint, 0  },.
36d60 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c       { "test_sql
36d70 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20  ite3_log",      
36d80 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f     test_sqlite3_
36d90 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64  log, 0  },.#ifnd
36da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
36db0 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70  XPLAIN.     { "p
36dc0 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65  rint_explain_que
36dd0 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70  ry_plan", test_p
36de0 72 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a  rint_eqp, 0  },.
36df0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
36e00 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36e10 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f  rol", test_test_
36e20 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53  control },.#if S
36e30 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20  QLITE_OS_UNIX.  
36e40 20 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22     { "getrusage"
36e50 2c 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65  , test_getrusage
36e60 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
36e70 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65  { "load_static_e
36e80 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f  xtension", tclLo
36e90 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
36ea0 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22  nCmd },.     { "
36eb0 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65  sorter_test_fake
36ec0 68 65 61 70 22 2c 20 73 6f 72 74 65 72 5f 74 65  heap", sorter_te
36ed0 73 74 5f 66 61 6b 65 68 65 61 70 20 7d 2c 0a 20  st_fakeheap },. 
36ee0 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65      { "sorter_te
36ef0 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 22  st_sort4_helper"
36f00 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f  , sorter_test_so
36f10 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c 0a 23 69  rt4_helper },.#i
36f20 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
36f30 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
36f40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36f50 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
36f60 65 22 2c 20 74 65 73 74 5f 75 73 65 72 5f 61 75  e", test_user_au
36f70 74 68 65 6e 74 69 63 61 74 65 2c 20 30 20 7d 2c  thenticate, 0 },
36f80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36f90 5f 75 73 65 72 5f 61 64 64 22 2c 20 20 20 20 20  _user_add",     
36fa0 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f 61       test_user_a
36fb0 64 64 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  dd,          0 }
36fc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36fd0 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 22 2c 20  3_user_change", 
36fe0 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f        test_user_
36ff0 63 68 61 6e 67 65 2c 20 20 20 20 20 20 20 30 20  change,       0 
37000 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
37010 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 22 2c  e3_user_delete",
37020 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72         test_user
37030 5f 64 65 6c 65 74 65 2c 20 20 20 20 20 20 20 30  _delete,       0
37040 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   },.#endif.#ifde
37050 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37060 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
37070 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37080 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 22  stmt_scanstatus"
37090 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
370a0 74 5f 73 63 61 6e 73 74 61 74 75 73 2c 20 20 20  t_scanstatus,   
370b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
370c0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
370d0 61 74 75 73 5f 72 65 73 65 74 22 2c 20 74 65 73  atus_reset", tes
370e0 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
370f0 73 5f 72 65 73 65 74 2c 20 20 20 30 20 7d 2c 0a  s_reset,   0 },.
37100 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
37110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
37120 4f 47 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  OG.     { "sqlit
37130 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67  e3_config_sqllog
37140 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
37150 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 2c 20 20  config_sqllog,  
37160 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20   0 },.#endif.   
37170 20 20 7b 20 22 76 66 73 5f 63 75 72 72 65 6e 74    { "vfs_current
37180 5f 74 69 6d 65 5f 69 6e 74 36 34 22 2c 20 20 20  _time_int64",   
37190 20 20 20 20 20 20 20 20 76 66 73 43 75 72 72 65          vfsCurre
371a0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 30  ntTimeInt64,   0
371b0 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
371c0 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
371d0 54 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  T.     { "sqlite
371e0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 22 2c  3_snapshot_get",
371f0 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67   test_snapshot_g
37200 65 74 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  et, 0 },.     { 
37210 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  "sqlite3_snapsho
37220 74 5f 6f 70 65 6e 22 2c 20 74 65 73 74 5f 73 6e  t_open", test_sn
37230 61 70 73 68 6f 74 5f 6f 70 65 6e 2c 20 30 20 7d  apshot_open, 0 }
37240 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37250 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 22  3_snapshot_free"
37260 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f  , test_snapshot_
37270 66 72 65 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20  free, 0 },.     
37280 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  { "sqlite3_snaps
37290 68 6f 74 5f 63 6d 70 22 2c 20 74 65 73 74 5f 73  hot_cmp", test_s
372a0 6e 61 70 73 68 6f 74 5f 63 6d 70 2c 20 30 20 7d  napshot_cmp, 0 }
372b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
372c0 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76  3_snapshot_recov
372d0 65 72 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68  er", test_snapsh
372e0 6f 74 5f 72 65 63 6f 76 65 72 2c 20 30 20 7d 2c  ot_recover, 0 },
372f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37300 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c  _snapshot_get_bl
37310 6f 62 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68  ob", test_snapsh
37320 6f 74 5f 67 65 74 5f 62 6c 6f 62 2c 20 30 20 7d  ot_get_blob, 0 }
37330 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37340 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f  3_snapshot_open_
37350 62 6c 6f 62 22 2c 20 74 65 73 74 5f 73 6e 61 70  blob", test_snap
37360 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62 2c 20  shot_open_blob, 
37370 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37380 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  ite3_snapshot_cm
37390 70 5f 62 6c 6f 62 22 2c 20 74 65 73 74 5f 73 6e  p_blob", test_sn
373a0 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 2c  apshot_cmp_blob,
373b0 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20   0 },.#endif.   
373c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 65 6c    { "sqlite3_del
373d0 65 74 65 5f 64 61 74 61 62 61 73 65 22 2c 20 74  ete_database", t
373e0 65 73 74 5f 64 65 6c 65 74 65 5f 64 61 74 61 62  est_delete_datab
373f0 61 73 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20  ase, 0 },.  };. 
37400 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d   static int bitm
37410 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f  ask_size = sizeo
37420 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20  f(Bitmask)*8;.  
37430 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6e 67 64  static int longd
37440 6f 75 62 6c 65 5f 73 69 7a 65 20 3d 20 73 69 7a  ouble_size = siz
37450 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54  eof(LONGDOUBLE_T
37460 59 50 45 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  YPE);.  int i;. 
37470 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
37480 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
37490 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
374a0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
374b0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65   int sqlite3_ope
374c0 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65  ntemp_count;.  e
374d0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
374e0 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20  3_like_count;.  
374f0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
37500 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
37510 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
37520 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
37530 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ddb_count;.  ext
37540 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
37550 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
37560 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
37570 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
37580 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69  writej_count;.#i
37590 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
375a0 20 20 65 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f    extern LONG vo
375b0 6c 61 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f  latile sqlite3_o
375c0 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23  s_type;.#endif.#
375d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
375e0 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  UG.  extern int 
375f0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
37600 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
37610 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a  sqlite3OSTrace;.
37620 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
37630 69 74 65 33 57 61 6c 54 72 61 63 65 3b 0a 23 65  ite3WalTrace;.#e
37640 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
37650 54 45 5f 54 45 53 54 0a 23 69 66 64 65 66 20 53  TE_TEST.#ifdef S
37660 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
37670 33 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  3.  extern int s
37680 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62  qlite3_fts3_enab
37690 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a  le_parentheses;.
376a0 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
376b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
376c0 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
376d0 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
376e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
376f0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
37700 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
37710 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
37720 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
37730 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
37740 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
37750 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
37760 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
37770 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
37780 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
37790 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
377a0 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
377b0 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
377c0 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
377d0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
377e0 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
377f0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
37800 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
37810 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
37820 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
37830 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
37840 2c 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f  , "sqlite_found_
37850 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
37860 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
37870 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  ound_count, TCL_
37880 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
37890 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
378a0 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f   "sqlite_sort_co
378b0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
378c0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72  ar*)&sqlite3_sor
378d0 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
378e0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
378f0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
37900 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
37910 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68  ize", .      (ch
37920 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78  ar*)&sqlite3_max
37930 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c  _blobsize, TCL_L
37940 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
37950 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
37960 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75  "sqlite_like_cou
37970 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
37980 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65  r*)&sqlite3_like
37990 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
379a0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
379b0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
379c0 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63  lite_interrupt_c
379d0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
379e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e  har*)&sqlite3_in
379f0 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54  terrupt_count, T
37a00 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
37a10 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
37a20 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
37a30 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _file_count", . 
37a40 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
37a50 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
37a60 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
37a70 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
37a80 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
37a90 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22  te_current_time"
37aa0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
37ab0 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  &sqlite3_current
37ac0 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _time, TCL_LINK_
37ad0 49 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  INT);.#if SQLITE
37ae0 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69  _OS_UNIX && defi
37af0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
37b00 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
37b10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37b20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
37b30 72 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74  rp, "sqlite_host
37b40 69 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20  id_num", .      
37b50 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
37b60 68 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f  hostid_num, TCL_
37b70 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
37b80 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
37b90 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
37ba0 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c  _xferopt_count",
37bb0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
37bc0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
37bd0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
37be0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
37bf0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
37c00 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
37c10 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
37c20 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70  char*)&sqlite3_p
37c30 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
37c40 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
37c50 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
37c60 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
37c70 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
37c80 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
37c90 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67  ar*)&sqlite3_pag
37ca0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
37cb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
37cc0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
37cd0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
37ce0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37cf0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
37d00 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72  *)&sqlite3_pager
37d10 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54  _writej_count, T
37d20 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
37d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37d40 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69  T_UTF16.  Tcl_Li
37d50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75  nkVar(interp, "u
37d60 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
37d70 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20  counter",.      
37d80 28 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65  (char*)&unaligne
37d90 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
37da0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
37db0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
37dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
37dd0 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
37de0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
37df0 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c  last_needed_coll
37e00 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63  ation",.      (c
37e10 68 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f  har*)&pzNeededCo
37e20 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e  llation, TCL_LIN
37e30 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e  K_STRING|TCL_LIN
37e40 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65  K_READ_ONLY);.#e
37e50 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
37e60 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e  OS_WIN.  Tcl_Lin
37e70 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
37e80 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20  lite_os_type",. 
37e90 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
37ea0 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43  ite3_os_type, TC
37eb0 4c 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65  L_LINK_LONG);.#e
37ec0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
37ed0 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
37ee0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
37ef0 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20  r *query_plan = 
37f00 22 2a 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41  "*** OBSOLETE VA
37f10 52 49 41 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20  RIABLE ***";.   
37f20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
37f30 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65  erp, "sqlite_que
37f40 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20  ry_plan",.      
37f50 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70   (char*)&query_p
37f60 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  lan, TCL_LINK_ST
37f70 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
37f80 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65  AD_ONLY);.  }.#e
37f90 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
37fa0 54 45 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c  TE_DEBUG.  Tcl_L
37fb0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
37fc0 73 71 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61  sqlite_where_tra
37fd0 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ce",.      (char
37fe0 2a 29 26 73 71 6c 69 74 65 33 57 68 65 72 65 54  *)&sqlite3WhereT
37ff0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
38000 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
38010 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
38020 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20  te_os_trace",.  
38030 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
38040 74 65 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f  te3OSTrace, TCL_
38050 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
38060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
38070 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  AL.  Tcl_LinkVar
38080 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
38090 5f 77 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20  _wal_trace",.   
380a0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
380b0 65 33 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f  e3WalTrace, TCL_
380c0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
380d0 66 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  f.#endif.#ifndef
380e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
380f0 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  KIO.  Tcl_LinkVa
38100 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
38110 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  e_opentemp_count
38120 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
38130 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d  &sqlite3_opentem
38140 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  p_count, TCL_LIN
38150 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
38160 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
38170 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
38180 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c  tic_bind_value",
38190 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
381a0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
381b0 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e  d_value, TCL_LIN
381c0 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
381d0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
381e0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sq