/ Hex Artifact Content
Login

Artifact 983ad8bf1c36b4620ae038d22a12bffefad98d9ea5a327e96de03f3b82d3d997:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f080: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f090: 52 45 50 52 45 50 41 52 45 22 2c 20 20 20 20 20  REPREPARE",     
f0a0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f0b0: 54 55 53 5f 52 45 50 52 45 50 41 52 45 20 20 20  TUS_REPREPARE   
f0c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f0d0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f0e0: 52 55 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  RUN",           
f0f0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f100: 54 55 53 5f 52 55 4e 20 20 20 20 20 20 20 20 20  TUS_RUN         
f110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f120: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f130: 4d 45 4d 55 53 45 44 22 2c 20 20 20 20 20 20 20  MEMUSED",       
f140: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f150: 54 55 53 5f 4d 45 4d 55 53 45 44 20 20 20 20 20  TUS_MEMUSED     
f160: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f170: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f180: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f190: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f1a0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f1b0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f1c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f1d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f1e0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f1f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f200: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f210: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f230: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f260: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f270: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f280: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f290: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f2a0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f2b0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f2d0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f2e0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f2f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f300: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f310: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f330: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f340: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f350: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f360: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f380: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f390: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f3a0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f3b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f3d0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f3e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f3f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f410: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f420: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f430: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f440: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f450: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f460: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f470: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f480: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f490: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f4a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f4b0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f4c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f4d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f4e0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f4f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f500: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f530: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f550: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f560: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f570: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f580: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f590: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f5a0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f5b0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f5c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f5d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f5e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f5f0: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f610: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f620: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f630: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f640: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f650: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f660: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f670: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f680: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f690: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f6a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f6c0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f6d0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f6e0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f6f0: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f700: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f710: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f720: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f750: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f760: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f770: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f780: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f790: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f7a0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f7b0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f7c0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7d0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f7e0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f7f0: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f800: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f840: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f850: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f860: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f870: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f880: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f8a0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f8b0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8c0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f8d0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f8e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f8f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f900: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f910: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f920: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f950: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f970: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f980: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f990: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f9a0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f9b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f9c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f9d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f9e0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f9f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
fa00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fa10: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fa20: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
fa30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
fa40: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fa50: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fa60: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fa70: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
fa80: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
fa90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
faa0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fac0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
fad0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
fae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
faf0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fb00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fb10: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fb20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fb30: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fb50: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fb60: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fb70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fb80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
fb90: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fba0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fbb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fbc0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fbd0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fbe0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fbf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fc00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fc10: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fc20: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fc30: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fc40: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fc60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fc70: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fc80: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fca0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fcd0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fce0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fcf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fd00: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fd10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fd20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fd30: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fd40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fd50: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fd60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fd70: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fd80: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fd90: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fda0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fdb0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fdc0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fde0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fdf0: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fe00: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fe10: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fe20: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fe30: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fe40: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fe50: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fe60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fe70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fe80: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fe90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fea0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
feb0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fec0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fed0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fee0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fef0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
ff00: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73  sqlite3_config_s
ff10: 6f 72 74 65 72 72 65 66 0a 2a 2a 0a 2a 2a 20 53  orterref.**.** S
ff20: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f  et the SQLITE_CO
ff30: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
ff40: 49 5a 45 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  IZE configuratio
ff50: 6e 20 6f 70 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  n option.*/.stat
ff60: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
ff70: 4c 41 50 49 20 74 65 73 74 5f 63 6f 6e 66 69 67  LAPI test_config
ff80: 5f 73 6f 72 74 65 72 72 65 66 28 0a 20 20 76 6f  _sorterref(.  vo
ff90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ffa0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ffb0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
ffc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ffd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ffe0: 69 6e 74 20 69 56 61 6c 3b 0a 20 20 69 66 28 20  int iVal;.  if( 
fff0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10000 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10010 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10020 20 22 4e 42 59 54 45 22 29 3b 0a 20 20 20 20 72   "NBYTE");.    r
10030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10040 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
10050 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
10060 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69  erp, objv[1], &i
10070 56 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  Val) ) return TC
10080 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
10090 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
100a0 5f 43 4f 4e 46 49 47 5f 53 4f 52 54 45 52 52 45  _CONFIG_SORTERRE
100b0 46 5f 53 49 5a 45 2c 20 69 56 61 6c 29 3b 0a 20  F_SIZE, iVal);. 
100c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
100d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
100e0 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  vfs_current_time
100f0 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74  _int64.**.** Ret
10100 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  urn the value re
10110 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65  turned by the de
10120 66 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72  fault VFS's xCur
10130 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65  rentTimeInt64 me
10140 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
10150 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
10160 49 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65  I vfsCurrentTime
10170 49 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  Int64(.  void * 
10180 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10190 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
101a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
101b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
101c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74  bjv[].){.  i64 t
101d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
101e0 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
101f0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
10200 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
10210 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10220 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10230 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
10240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10250 20 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72   }.  pVfs->xCurr
10260 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
10270 73 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65  s, &t);.  Tcl_Se
10280 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10290 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
102a0 74 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75  tObj(t));.  retu
102b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
102c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
102d0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
102e0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
102f0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42  _snapshot_get DB
10300 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69   DBNAME.*/.stati
10310 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
10320 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  API test_snapsho
10330 74 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_get(.  void * 
10340 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10350 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10360 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10370 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10380 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
10390 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
103a0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
103b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
103c0 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d  hot *pSnapshot =
103d0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
103e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
103f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10400 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
10410 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
10420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10430 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
10440 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10460 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10480 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
10490 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
104a0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
104b0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64  3_snapshot_get(d
104c0 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70  b, zName, &pSnap
104d0 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21  shot);.  if( rc!
104e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
104f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10500 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10510 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
10520 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
10530 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  -1));.    return
10540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
10550 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
10560 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28  uf[100];.    if(
10570 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
10580 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
10590 70 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68  p, zBuf, pSnapsh
105a0 6f 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ot) ) return TCL
105b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
105c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
105d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
105e0 6e 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29  ngObj(zBuf, -1))
105f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10600 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10610 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10620 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10630 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10640 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10650 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10660 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65  _snapshot_recove
10670 72 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  r DB DBNAME.*/.s
10680 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10690 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
106a0 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20  pshot_recover(. 
106b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
106c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
106d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
106e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
106f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10700 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10710 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
10720 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20   *zName;..  if( 
10730 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10740 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10750 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10760 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20   "DB DBNAME");. 
10770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10780 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10790 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
107a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
107b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
107c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
107d0 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  ROR;.  zName = T
107e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
107f0 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[2]);..  rc = s
10800 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
10810 72 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d  recover(db, zNam
10820 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
10830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
10840 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10850 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10860 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
10870 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
10880 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10890 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
108a0 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
108b0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
108c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
108d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
108e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
108f0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
10900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10910 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10920 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10930 61 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44  apshot_open DB D
10940 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a  BNAME SNAPSHOT.*
10950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
10960 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
10970 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
10980 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10990 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
109a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
109b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
109c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
109d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
109e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
109f0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
10a00 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e  e3_snapshot *pSn
10a10 61 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f  apshot;..  if( o
10a20 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
10a30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10a40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10a50 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
10a60 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
10a70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10a80 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
10a90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10aa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10ab0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
10ac0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
10ad0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
10ae0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
10af0 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71   pSnapshot = (sq
10b00 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29  lite3_snapshot*)
10b10 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
10b20 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69  oPtr(Tcl_GetStri
10b30 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20  ng(objv[3]));.. 
10b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e   rc = sqlite3_sn
10b50 61 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20  apshot_open(db, 
10b60 7a 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74  zName, pSnapshot
10b70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10b90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10ba0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10bb0 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
10bc0 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
10bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10be0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
10bf0 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
10c00 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
10c10 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
10c20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10c30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10c40 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10c50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10c60 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
10c70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
10c80 70 73 68 6f 74 5f 66 72 65 65 20 53 4e 41 50 53  pshot_free SNAPS
10c90 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
10ca0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
10cb0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72  test_snapshot_fr
10cc0 65 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ee(.  void * cli
10cd0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10ce0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10cf0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10d00 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10d10 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
10d20 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
10d30 68 6f 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  hot;.  if( objc!
10d40 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
10d50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10d60 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41  p, 1, objv, "SNA
10d70 50 53 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74  PSHOT");.    ret
10d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10d90 20 7d 0a 20 20 70 53 6e 61 70 73 68 6f 74 20 3d   }.  pSnapshot =
10da0 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68   (sqlite3_snapsh
10db0 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  ot*)sqlite3TestT
10dc0 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74  extToPtr(Tcl_Get
10dd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
10de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ;.  sqlite3_snap
10df0 73 68 6f 74 5f 66 72 65 65 28 70 53 6e 61 70 73  shot_free(pSnaps
10e00 68 6f 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  hot);.  return T
10e10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10e20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10e30 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10e40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10e50 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10e60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10e70 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 20 53 4e  _snapshot_cmp SN
10e80 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54  APSHOT1 SNAPSHOT
10e90 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  2.*/.static int 
10ea0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
10eb0 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28  st_snapshot_cmp(
10ec0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10ed0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10ee0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10ef0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10f00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10f10 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
10f20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10f30 20 2a 70 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *p1;.  sqlite3_
10f40 73 6e 61 70 73 68 6f 74 20 2a 70 32 3b 0a 20 20  snapshot *p2;.  
10f50 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10f60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10f70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10f80 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 31 20  bjv, "SNAPSHOT1 
10f90 53 4e 41 50 53 48 4f 54 32 22 29 3b 0a 20 20 20  SNAPSHOT2");.   
10fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10fb0 52 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 28 73  R;.  }.  p1 = (s
10fc0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a  qlite3_snapshot*
10fd0 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74  )sqlite3TestText
10fe0 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72  ToPtr(Tcl_GetStr
10ff0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20  ing(objv[1]));. 
11000 20 70 32 20 3d 20 28 73 71 6c 69 74 65 33 5f 73   p2 = (sqlite3_s
11010 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65 33  napshot*)sqlite3
11020 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63  TestTextToPtr(Tc
11030 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11040 5b 32 5d 29 29 3b 0a 20 20 72 65 73 20 3d 20 73  [2]));.  res = s
11050 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
11060 63 6d 70 28 70 31 2c 20 70 32 29 3b 0a 20 20 54  cmp(p1, p2);.  T
11070 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11080 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
11090 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20 20 72  ntObj(res));.  r
110a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
110b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
110c0 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
110d0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
110e0 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
110f0 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OT./*.** Usage: 
11100 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11110 5f 67 65 74 5f 62 6c 6f 62 20 44 42 20 44 42 4e  _get_blob DB DBN
11120 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
11130 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
11140 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67 65  test_snapshot_ge
11150 74 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  t_blob(.  void *
11160 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11170 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11180 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11190 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
111a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
111b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
111c0 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  b;.  char *zName
111d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ;.  sqlite3_snap
111e0 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20  shot *pSnapshot 
111f0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
11200 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
11210 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11220 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
11230 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
11260 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11270 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11280 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
11290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
112a0 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
112b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
112c0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
112d0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
112e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61  db, zName, &pSna
112f0 70 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63  pshot);.  if( rc
11300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11310 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11320 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11330 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
11340 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
11350 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
11360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11370 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65  else{.    Tcl_Se
11380 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11390 70 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  p, .        Tcl_
113a0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
113b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
113c0 70 53 6e 61 70 73 68 6f 74 2c 20 73 69 7a 65 6f  pSnapshot, sizeo
113d0 66 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  f(sqlite3_snapsh
113e0 6f 74 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ot)).    );.    
113f0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11400 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
11410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
11420 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
11430 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11440 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
11450 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11460 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 20 20 2f 2a  LE_SNAPSHOT.  /*
11470 0a 20 20 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  .  ** Usage: sql
11480 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
11490 65 6e 5f 62 6c 6f 62 20 44 42 20 44 42 4e 41 4d  en_blob DB DBNAM
114a0 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74  E SNAPSHOT.*/.st
114b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
114c0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
114d0 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62 28 0a  shot_open_blob(.
114e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
114f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
11500 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
11510 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
11520 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
11530 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
11540 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
11550 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69  r *zName;.  unsi
11560 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62  gned char *pBlob
11570 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a  ;.  int nBlob;..
11580 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
11590 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
115a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
115b0 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
115c0 45 20 53 4e 41 50 53 48 4f 54 22 29 3b 0a 20 20  E SNAPSHOT");.  
115d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
115e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
115f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
11600 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11610 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
11620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11630 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63  OR;.  zName = Tc
11640 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11650 5b 32 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  [2]);.  pBlob = 
11660 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
11670 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
11680 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &nBlob);.  if( 
11690 6e 42 6c 6f 62 21 3d 73 69 7a 65 6f 66 28 73 71  nBlob!=sizeof(sq
116a0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20  lite3_snapshot) 
116b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
116c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
116d0 22 62 61 64 20 53 4e 41 50 53 48 4f 54 22 2c 20  "bad SNAPSHOT", 
116e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
116f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11700 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
11710 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a  pshot_open(db, z
11720 4e 61 6d 65 2c 20 28 73 71 6c 69 74 65 33 5f 73  Name, (sqlite3_s
11730 6e 61 70 73 68 6f 74 2a 29 70 42 6c 6f 62 29 3b  napshot*)pBlob);
11740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
11760 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11770 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11780 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
11790 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
117a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
117b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
117c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
117d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
117e0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
117f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11800 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
11810 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
11820 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  ite3_snapshot_cm
11830 70 5f 62 6c 6f 62 20 53 4e 41 50 53 48 4f 54 31  p_blob SNAPSHOT1
11840 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74   SNAPSHOT2.*/.st
11850 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11860 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
11870 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 28 0a 20  shot_cmp_blob(. 
11880 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11890 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
118a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
118b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
118c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
118d0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 6e  .  int res;.  un
118e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 31 3b  signed char *p1;
118f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11900 20 2a 70 32 3b 0a 20 20 69 6e 74 20 6e 31 3b 0a   *p2;.  int n1;.
11910 20 20 69 6e 74 20 6e 32 3b 0a 0a 20 20 69 66 28    int n2;..  if(
11920 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11930 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11940 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11950 2c 20 22 53 4e 41 50 53 48 4f 54 31 20 53 4e 41  , "SNAPSHOT1 SNA
11960 50 53 48 4f 54 32 22 29 3b 0a 20 20 20 20 72 65  PSHOT2");.    re
11970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11980 20 20 7d 0a 0a 20 20 70 31 20 3d 20 54 63 6c 5f    }..  p1 = Tcl_
11990 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
119a0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 31  Obj(objv[1], &n1
119b0 29 3b 0a 20 20 70 32 20 3d 20 54 63 6c 5f 47 65  );.  p2 = Tcl_Ge
119c0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
119d0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 32 29 3b  j(objv[2], &n2);
119e0 0a 0a 20 20 69 66 28 20 6e 31 21 3d 73 69 7a 65  ..  if( n1!=size
119f0 6f 66 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  of(sqlite3_snaps
11a00 68 6f 74 29 20 7c 7c 20 6e 31 21 3d 6e 32 20 29  hot) || n1!=n2 )
11a10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11a20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11a30 62 61 64 20 53 4e 41 50 53 48 4f 54 22 2c 20 30  bad SNAPSHOT", 0
11a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11a50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11a60 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e  res = sqlite3_sn
11a70 61 70 73 68 6f 74 5f 63 6d 70 28 28 73 71 6c 69  apshot_cmp((sqli
11a80 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 31  te3_snapshot*)p1
11a90 2c 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  , (sqlite3_snaps
11aa0 68 6f 74 2a 29 70 32 29 3b 0a 20 20 54 63 6c 5f  hot*)p2);.  Tcl_
11ab0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11ac0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
11ad0 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75  bj(res));.  retu
11ae0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
11af0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11b00 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
11b10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
11b20 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
11b30 74 61 62 61 73 65 20 46 49 4c 45 4e 41 4d 45 0a  tabase FILENAME.
11b40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
11b50 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 28 63  elete_database(c
11b60 6f 6e 73 74 20 63 68 61 72 2a 29 3b 20 20 20 2f  onst char*);   /
11b70 2a 20 69 6e 20 74 65 73 74 5f 64 65 6c 65 74 65  * in test_delete
11b80 2e 63 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .c */.static int
11b90 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
11ba0 65 73 74 5f 64 65 6c 65 74 65 5f 64 61 74 61 62  est_delete_datab
11bb0 61 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ase(.  void * cl
11bc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11bd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11be0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11bf0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11c00 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
11c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11c20 46 69 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  File;.  if( objc
11c30 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
11c40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11c50 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
11c60 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
11c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11c80 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74    zFile = (const
11c90 20 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 53 74   char*)Tcl_GetSt
11ca0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
11cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
11cc0 6c 65 74 65 5f 64 61 74 61 62 61 73 65 28 7a 46  lete_database(zF
11cd0 69 6c 65 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  ile);..  Tcl_Set
11ce0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11cf0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11d00 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
11d10 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 72  e(rc), -1));.  r
11d20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11d30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 74  ./*.** Usage: at
11d40 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72 69 74 65  omic_batch_write
11d50 20 50 41 54 48 0a 2a 2f 0a 73 74 61 74 69 63 20   PATH.*/.static 
11d60 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
11d70 49 20 74 65 73 74 5f 61 74 6f 6d 69 63 5f 62 61  I test_atomic_ba
11d80 74 63 68 5f 77 72 69 74 65 28 0a 20 20 76 6f 69  tch_write(.  voi
11d90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11da0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11db0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11dc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
11dd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
11de0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 20  har *zFile = 0; 
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e00 2a 20 50 61 74 68 20 74 6f 20 66 69 6c 65 20 74  * Path to file t
11e10 6f 20 74 65 73 74 20 2a 2f 0a 20 20 73 71 6c 69  o test */.  sqli
11e20 74 65 33 20 2a 64 62 20 3d 20 30 3b 20 20 20 20  te3 *db = 0;    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11e40 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
11e50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11e60 20 2a 70 46 64 20 3d 20 30 3b 20 20 20 20 20 20   *pFd = 0;      
11e70 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 64      /* SQLite fd
11e80 20 6f 70 65 6e 20 6f 6e 20 7a 46 69 6c 65 20 2a   open on zFile *
11e90 2f 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20 30  /.  int bRes = 0
11ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11eb0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
11ec0 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 63 6f  esult of this co
11ed0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 64  mmand */.  int d
11ee0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
11ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
11f00 76 69 63 65 2d 63 68 61 72 61 63 74 65 72 69 73  vice-characteris
11f10 74 69 63 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 69  tics mask */.  i
11f20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f40 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
11f50 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
11f60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
11f70 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
11f80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11f90 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b  , objv, "PATH");
11fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11fb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
11fc0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
11fd0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  ng(objv[1]);..  
11fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
11ff0 6e 28 7a 46 69 6c 65 2c 20 26 64 62 29 3b 0a 20  n(zFile, &db);. 
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
12020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12030 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
12040 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73  g(db), 0);.    s
12050 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
12060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12070 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
12080 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
12090 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
120a0 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
120b0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20  L_FILE_POINTER, 
120c0 28 76 6f 69 64 2a 29 26 70 46 64 29 3b 0a 20 20  (void*)&pFd);.  
120d0 64 63 20 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f  dc = pFd->pMetho
120e0 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61  ds->xDeviceChara
120f0 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b  cteristics(pFd);
12100 0a 20 20 69 66 28 20 64 63 20 26 20 53 51 4c 49  .  if( dc & SQLI
12110 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
12120 54 4f 4d 49 43 20 29 7b 0a 20 20 20 20 62 52 65  TOMIC ){.    bRe
12130 73 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 54 63  s = 1;.  }..  Tc
12140 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12150 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
12160 74 4f 62 6a 28 62 52 65 73 29 29 3b 0a 20 20 73  tObj(bRes));.  s
12170 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
12180 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12190 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
121a0 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
121b0 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
121c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
121d0 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
121e0 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
121f0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
12200 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
12210 50 49 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d  PI test_next_stm
12220 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
12230 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12240 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12250 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12260 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12270 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
12280 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71  tmt *pStmt;.  sq
12290 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20  lite3 *db = 0;. 
122a0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
122b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
122c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
122d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
122e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
122f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
12300 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
12310 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
12320 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54  ], 0), " DB STMT
12330 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12350 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
12360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12380 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
12390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
123a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
123b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
123c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
123d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
123e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123f0 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   pStmt = sqlite3
12400 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70  _next_stmt(db, p
12410 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74  Stmt);.  if( pSt
12420 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
12430 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12440 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
12450 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
12460 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12470 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12480 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
12490 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
124a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
124b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
124c0 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
124d0 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  nly  STMT.**.** 
124e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
124f0 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  TMT is a NULL po
12500 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69 6e 74  inter or a point
12510 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
12520 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67 75 61  t.** that is gua
12530 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61 76 65  ranteed to leave
12540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 6e   the database un
12550 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
12560 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
12570 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
12580 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  readonly(.  void
12590 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
125a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
125b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
125c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
125d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
125e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
125f0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
12600 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
12610 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12620 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12630 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12640 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12650 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12660 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12670 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
12680 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12690 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
126a0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
126b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
126c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
126d0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
126e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
126f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
12700 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29  _readonly(pStmt)
12710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
12720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12730 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
12740 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
12750 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12760 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
12770 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 20 20 53  tmt_isexplain  S
12780 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
12790 20 31 2c 20 32 2c 20 6f 72 20 30 20 72 65 73 70   1, 2, or 0 resp
127a0 65 63 74 69 76 65 6c 79 20 69 66 20 53 54 4d 54  ectively if STMT
127b0 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 73   is an EXPLAIN s
127c0 74 61 74 65 6d 65 6e 74 2c 20 61 6e 0a 2a 2a 20  tatement, an.** 
127d0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
127e0 41 4e 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  AN statement or 
127f0 61 6e 20 6f 72 64 69 6e 61 72 79 20 73 74 61 74  an ordinary stat
12800 65 6d 65 6e 74 20 6f 72 20 4e 55 4c 4c 20 70 6f  ement or NULL po
12810 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
12820 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
12830 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 69 73 65  PI test_stmt_ise
12840 78 70 6c 61 69 6e 28 0a 20 20 76 6f 69 64 20 2a  xplain(.  void *
12850 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12860 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12870 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12880 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12890 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
128a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
128b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
128c0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
128d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
128e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
128f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12900 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12920 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12930 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
12940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12950 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
12960 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
12970 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12980 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12990 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
129a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
129b0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69  = sqlite3_stmt_i
129c0 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3b  sexplain(pStmt);
129d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
129e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
129f0 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
12a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
12a20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62    sqlite3_stmt_b
12a30 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  usy  STMT.**.** 
12a40 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
12a50 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c  TMT is a non-NUL
12a60 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  L pointer to a s
12a70 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
12a80 20 68 61 73 20 62 65 65 6e 20 73 74 65 70 70 65   has been steppe
12a90 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d  d but not to com
12aa0 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  pletion..*/.stat
12ab0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
12ac0 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 62  LAPI test_stmt_b
12ad0 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  usy(.  void * cl
12ae0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12af0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12b00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12b10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12b20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12b30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
12b40 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
12b50 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
12b60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12b70 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
12b80 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
12b90 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
12ba0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12bb0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12bc0 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
12bd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12be0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
12bf0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
12c00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12c10 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
12c20 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
12c30 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
12c40 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
12c50 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
12c60 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12c70 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
12c80 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  anObj(rc));.  re
12c90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12ca0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73  /*.** Usage:  us
12cb0 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
12cc0 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
12cd0 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
12ce0 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  uses a statement
12cf0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
12d00 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
12d10 43 4c 41 50 49 20 75 73 65 73 5f 73 74 6d 74 5f  CLAPI uses_stmt_
12d20 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20  journal(.  void 
12d30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12d40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12d50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12d60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12d70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
12d80 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
12d90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
12da0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
12db0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12dc0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
12dd0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
12de0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
12df0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
12e00 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22  [0], 0), " STMT"
12e10 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12e30 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
12e40 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
12e50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12e60 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
12e70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12e80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
12e90 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29  _readonly(pStmt)
12ea0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
12eb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12ec0 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28  _NewBooleanObj((
12ed0 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e  (Vdbe *)pStmt)->
12ee0 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29  usesStmtJournal)
12ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12f00 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
12f10 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
12f20 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  set  STMT .**.**
12f30 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d 65   Reset a stateme
12f40 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
12f50 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
12f60 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 73 65  TCLAPI test_rese
12f70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
12f80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12f90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12fa0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12fb0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12fc0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
12fd0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
12fe0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12ff0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
13000 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13010 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
13020 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13030 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
13040 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13050 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
13060 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
13070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13080 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
13090 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
130a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
130b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
130c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
130d0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
130e0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
130f0 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  tmt);.  if( pStm
13100 74 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74  t && sqlite3Test
13110 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
13120 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
13130 20 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   rc) ){.    retu
13140 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13150 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
13160 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
13170 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
13180 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
13190 2f 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  /*.  if( rc ){. 
131a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
131b0 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65  ROR;.  }.*/.  re
131c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
131d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
131e0 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54  lite3_expired ST
131f0 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
13200 20 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d   TRUE if a recom
13210 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
13220 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63  statement is rec
13230 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61  ommended..*/.sta
13240 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
13250 43 4c 41 50 49 20 74 65 73 74 5f 65 78 70 69 72  CLAPI test_expir
13260 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
13270 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13280 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13290 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
132a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
132b0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
132c0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
132d0 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
132e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66  tmt *pStmt;.  if
132f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
13300 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13310 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
13320 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
13330 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
13340 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
13350 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
13360 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
13370 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13380 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
13390 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
133a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
133b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
133c0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
133d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
133e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
133f0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
13400 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33  oleanObj(sqlite3
13410 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29  _expired(pStmt))
13420 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
13430 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
13440 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
13450 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
13460 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54  dings FROMSTMT T
13470 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  OSTMT.**.** Tran
13480 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67  sfer all binding
13490 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20  s from FROMSTMT 
134a0 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a  over to TOSTMT.*
134b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
134c0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
134d0 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20  transfer_bind(. 
134e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
134f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13500 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13510 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13520 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
13530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13540 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
13550 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
13560 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b  pStmt1, *pStmt2;
13570 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
13580 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
13590 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
135a0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
135b0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
135c0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
135d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
135e0 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54  ], 0), " FROM-ST
135f0 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b  MT TO-STMT", 0);
13600 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13610 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
13620 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
13630 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13640 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13650 26 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e  &pStmt1)) return
13660 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13670 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
13680 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13690 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
136a0 20 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72   &pStmt2)) retur
136b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
136c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
136d0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
136e0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
136f0 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
13700 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74  dings(pStmt1,pSt
13710 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  mt2)));.#endif. 
13720 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13730 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
13740 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
13750 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
13760 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
13770 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
13780 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
13790 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
137a0 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
137b0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
137c0 43 4c 41 50 49 20 74 65 73 74 5f 63 68 61 6e 67  CLAPI test_chang
137d0 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  es(.  void * cli
137e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
137f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13800 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13810 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13820 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
13830 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  *db;.  if( objc!
13840 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
13850 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13860 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13870 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13880 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
13890 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
138a0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
138b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
138c0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
138d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
138e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
138f0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
13900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13910 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
13920 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
13930 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
13940 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b  3_changes(db)));
13950 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
13960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13970 69 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62  is the "static_b
13980 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20  ind_value" that 
13990 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f  variables are bo
139a0 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74  und to when.** t
139b0 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f  he FLAG option o
139c0 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69  f sqlite3_bind i
139d0 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74  s "static".*/.st
139e0 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74  atic char *sqlit
139f0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
13a00 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  lue = 0;.static 
13a10 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69  int sqlite_stati
13a20 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30  c_bind_nbyte = 0
13a30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  ;../*.** Usage: 
13a40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56   sqlite3_bind  V
13a50 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46  M  IDX  VALUE  F
13a60 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20  LAGS.**.** Sets 
13a70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13a80 20 49 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e   IDX-th occurren
13a90 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65  ce of "?" in the
13aa0 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a   original SQL.**
13ab0 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20   string.  VALUE 
13ac0 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  is the new value
13ad0 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75  .  If FLAGS=="nu
13ae0 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69  ll" then VALUE i
13af0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64  s.** ignored and
13b00 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
13b10 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46  t to NULL.  If F
13b20 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74  LAGS=="static" t
13b30 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
13b40 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
13b50 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69 63  alue of a static
13b60 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a   variable named.
13b70 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  ** "sqlite_stati
13b80 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20  c_bind_value".  
13b90 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61  If FLAGS=="norma
13ba0 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a  l" then a copy.*
13bb0 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69  * of the VALUE i
13bc0 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47  s made.  If FLAG
13bd0 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e  S=="blob10" then
13be0 20 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f   a VALUE is igno
13bf0 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62  red.** an a 10-b
13c00 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30  yte blob "abc\00
13c10 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69  0xyz\000pq" is i
13c20 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  nserted..*/.stat
13c30 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
13c40 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 28 0a  LAPI test_bind(.
13c50 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
13c60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13c70 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
13c80 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
13c90 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
13ca0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
13cb0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
13cc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13cd0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
13ce0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
13cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
13d00 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
13d10 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
13d20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
13d30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
13d40 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
13d50 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
13d60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13d70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13d80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13d90 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
13da0 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
13db0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
13dc0 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
13dd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13de0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
13df0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
13e00 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
13e10 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13e20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13e30 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
13e40 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
13e50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13e60 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
13e70 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
13e80 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
13e90 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
13ea0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
13eb0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
13ec0 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
13ed0 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
13ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
13ef0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
13f00 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
13f10 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
13f20 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
13f30 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
13f40 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
13f50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
13f60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
13f70 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
13f80 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
13f90 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13fc0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
13fd0 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
13fe0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13ff0 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
14000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
14010 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
14020 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
14030 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
14040 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
14050 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14060 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
14070 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
14080 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
14090 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
140a0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
140b0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
140c0 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
140d0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
140e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
140f0 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
14100 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
14110 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
14120 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
14130 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
14140 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14150 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
14160 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
14170 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
14180 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
14190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
141a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
141b0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
141c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
141d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
141e0 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
141f0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
14200 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14210 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
14220 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
14230 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14240 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
14250 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
14260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14270 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
14280 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
14290 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
142a0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
142b0 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
142c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
142d0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
142e0 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
142f0 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
14300 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
14310 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
14320 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
14330 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
14340 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
14350 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
14360 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
14370 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
14380 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
14390 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
143a0 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
143b0 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
143c0 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
143d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
143e0 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
143f0 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
14400 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
14410 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
14420 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
14430 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
14440 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
14450 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
14460 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
14470 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
14480 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
14490 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
144a0 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
144b0 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
144c0 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
144d0 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
144e0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
144f0 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
14500 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
14510 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
14520 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
14530 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
14540 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
14550 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
14560 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
14570 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
14580 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
14590 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
145a0 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
145b0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
145c0 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
145d0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
145e0 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
145f0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
14600 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
14610 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
14620 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
14630 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
14640 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
14650 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
14660 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
14670 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
14680 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
14690 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
146a0 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72  k with one inter
146b0 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65  preter at a time
146c0 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  , as the.** inte
146d0 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73  rp pointer to us
146e0 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e  e when evaluatin
146f0 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  g the TCL script
14700 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
14710 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
14720 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  erp..*/.static T
14730 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74  cl_Interp* pTest
14740 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73  CollateInterp;.s
14750 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
14760 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76  ollate_func(.  v
14770 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  oid *pCtx, .  in
14780 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nA, const void
14790 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20   *zA,.  int nB, 
147a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
147b0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
147c0 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  i = pTestCollate
147d0 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e  Interp;.  int en
147e0 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  cin = SQLITE_PTR
147f0 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20  _TO_INT(pCtx);. 
14800 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
14810 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  n;..  sqlite3_va
14820 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c  lue *pVal;.  Tcl
14830 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20  _Obj *pX;..  pX 
14840 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
14850 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  bj("test_collate
14860 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
14870 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14880 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e  .  switch( encin
14890 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
148a0 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20  ITE_UTF8:.      
148b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
148c0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
148d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
148e0 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20  UTF-8",-1));.   
148f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14900 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  se SQLITE_UTF16L
14910 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
14920 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14930 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
14940 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c  ringObj("UTF-16L
14950 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
14960 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
14970 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20  QLITE_UTF16BE:. 
14980 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
14990 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
149a0 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
149b0 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d  Obj("UTF-16BE",-
149c0 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
149d0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
149e0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
149f0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65    }..  sqlite3Be
14a00 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14a10 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
14a20 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
14a30 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
14a40 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14a50 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a  tStr(pVal, nA, z
14a60 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  A, encin, SQLITE
14a70 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
14a80 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14a90 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
14aa0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14ab0 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
14ac0 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
14ad0 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
14ae0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14af0 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
14b00 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14b10 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a  tStr(pVal, nB, z
14b20 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  B, encin, SQLITE
14b30 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
14b40 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14b50 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
14b60 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14b70 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
14b80 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
14b90 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
14ba0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14bb0 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
14bc0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
14bd0 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ee(pVal);.  }.  
14be0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14bf0 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c  Malloc();..  Tcl
14c00 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58  _EvalObjEx(i, pX
14c10 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
14c20 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14c30 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
14c40 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  j(i, Tcl_GetObjR
14c50 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b  esult(i), &res);
14c60 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
14c70 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
14c80 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
14c90 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
14ca0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14cb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14cc0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14cd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14ce0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14cf0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
14d00 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al;.  sqlite3_va
14d10 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
14d20 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
14d30 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
14d40 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c  rgs;.  pTestColl
14d50 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  ateInterp = inte
14d60 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  rp;.  if( getDbP
14d70 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14d80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14d90 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
14da0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14db0 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
14dc0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
14dd0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14de0 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
14df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
14e10 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
14e20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
14e30 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  e", SQLITE_UTF8,
14e40 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
14e50 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c  d *)SQLITE_UTF8,
14e60 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
14e70 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
14e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14e90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  {.    const void
14ea0 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66   *zUtf16;.    if
14eb0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
14ec0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
14ed0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
14ee0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
14ef0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  TCL_ERROR;.    r
14f00 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
14f10 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
14f20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
14f30 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
14f40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76   .            (v
14f50 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
14f60 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16LE, val?test_c
14f70 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
14f80 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
14f90 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
14fa0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14fb0 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
14fc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14fd0 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20  ..#if 0.    if( 
14fe0 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
14ff0 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ail>0 ){.      s
15000 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
15010 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  il++;.    }.#end
15020 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  if.    sqlite3_m
15030 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
15040 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20  utex);.    pVal 
15050 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15060 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
15070 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
15080 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f  al, -1, "test_co
15090 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
150a0 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
150b0 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20  IC);.    zUtf16 
150c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
150d0 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
150e0 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
150f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15100 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
15110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15120 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
15130 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15140 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
15150 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20  n16(db, zUtf16, 
15160 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
15170 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
15180 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42   *)SQLITE_UTF16B
15190 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  E, val?test_coll
151a0 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20  ate_func:0);.   
151b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
151c0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
151d0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
151e0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
151f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
15200 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
15210 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
15220 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15230 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21  OR;.  .  if( rc!
15240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15250 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15260 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
15270 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
15280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15290 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
152a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
152b0 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
152c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
152d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
152e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
152f0 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
15300 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15310 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
15320 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
15330 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
15340 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
15350 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
15360 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 75  sage: add_test_u
15370 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20  tf16bin_collate 
15380 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41  <db ptr>.**.** A
15390 64 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c  dd a utf-16 coll
153a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
153b0 61 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22 20  amed "utf16bin" 
153c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
153d0 2a 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  ** handle. This 
153e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
153f0 63 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67 75  ce compares argu
15400 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d  ments in the sam
15410 65 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20  e way as the.** 
15420 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
15430 6f 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a  on "binary"..*/.
15440 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15450 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
15460 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  _func(.  void *p
15470 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20  Ctx, .  int nA, 
15480 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
15490 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20    int nB, const 
154a0 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e  void *zB.){.  in
154b0 74 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20  t nCmp = (nA>nB 
154c0 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e  ? nB : nA);.  in
154d0 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a  t res = memcmp(z
154e0 41 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20  A, zB, nCmp);.  
154f0 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
15500 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65   = nA - nB;.  re
15510 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74  turn res;.}.stat
15520 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
15530 4c 41 50 49 20 74 65 73 74 5f 75 74 66 31 36 62  LAPI test_utf16b
15540 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  in_collate(.  vo
15550 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15560 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15570 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15580 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15590 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
155a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
155b0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
155c0 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64  jc!=2 ) goto bad
155d0 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
155e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
155f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15600 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
15610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15620 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15630 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
15640 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 62 69  ion(db, "utf16bi
15650 6e 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  n", SQLITE_UTF16
15660 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
15670 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
15680 65 5f 66 75 6e 63 0a 20 20 29 3b 0a 20 20 69 66  e_func.  );.  if
15690 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
156a0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
156b0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
156c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
156d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
156e0 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67  rgs:.  Tcl_Wrong
156f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15700 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
15710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15720 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  OR;.}../*.** Whe
15730 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
15740 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
15750 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f  is invoked, reco
15760 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a  rd the name of .
15770 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15780 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
15790 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72  ion here.  The r
157a0 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20  ecorded name is 
157b0 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54  linked.** to a T
157c0 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  CL variable and 
157d0 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
157e0 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75 65  e that the reque
157f0 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a  sted collation.*
15800 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63  * name is correc
15810 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  t..*/.static cha
15820 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  r zNeededCollati
15830 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20  on[200];.static 
15840 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f  char *pzNeededCo
15850 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65  llation = zNeede
15860 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a  dCollation;.../*
15870 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
15880 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
15890 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20  ence is needed. 
158a0 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   Registered usin
158b0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  g.** sqlite3_col
158c0 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
158d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
158e0 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d test_collate_n
158f0 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64  eeded_cb(.  void
15900 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74   *pCtx, .  sqlit
15910 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54  e3 *db,.  int eT
15920 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20  extRep,.  const 
15930 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20  void *pName.){. 
15940 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64   int enc = ENC(d
15950 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b);.  int i;.  c
15960 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20  har *z;.  for(z 
15970 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20  = (char*)pName, 
15980 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b  i=0; *z || z[1];
15990 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
159a0 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  z ) zNeededColla
159b0 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a  tion[i++] = *z;.
159c0 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c    }.  zNeededCol
159d0 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20  lation[i] = 0;. 
159e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
159f0 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20  collation(.     
15a00 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61   db, "test_colla
15a10 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 53 51  te", ENC(db), SQ
15a20 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
15a30 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  enc), test_colla
15a40 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  te_func);.}../*.
15a50 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
15a60 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
15a70 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d DB.*/.static i
15a80 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
15a90 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
15aa0 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  eded(.  void * c
15ab0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15ac0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15ad0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15ae0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15af0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15b00 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
15b10 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
15b20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
15b30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
15b40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15b50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15b60 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
15b70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
15b80 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  c = sqlite3_coll
15b90 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64  ation_needed16(d
15ba0 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  b, 0, test_colla
15bb0 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20  te_needed_cb);. 
15bc0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
15bd0 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  n[0] = 0;.  if( 
15be0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
15bf0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
15c00 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15c10 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
15c20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
15c30 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
15c40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
15c50 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
15c60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
15c80 64 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65  d:   add_alignme
15c90 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
15ca0 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64  ns  DB.**.** Add
15cb0 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69   two new collati
15cc0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20  ng sequences to 
15cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a  the database DB.
15ce0 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  **.**     utf16_
15cf0 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75  aligned.**     u
15d00 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a  tf16_unaligned.*
15d10 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  *.** Both collat
15d20 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
15d30 65 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20  e the same sort 
15d40 6f 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e  order as BINARY.
15d50 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66  .** The only dif
15d60 66 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20  ference is that 
15d70 74 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65  the utf16_aligne
15d80 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  d collating.** s
15d90 65 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61  equence is decla
15da0 72 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  red with the SQL
15db0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
15dc0 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20  D flag..** Both 
15dd0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
15de0 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ons increment th
15df0 65 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31  e unaligned utf1
15e00 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65  6 counter.** whe
15e10 6e 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61  never they see a
15e20 20 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67   string that beg
15e30 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79  ins on an odd by
15e40 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
15e50 73 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69  static int unali
15e60 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
15e70 74 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ter = 0;.static 
15e80 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c  int alignmentCol
15e90 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
15ea0 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
15eb0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
15ec0 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
15ed0 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
15ee0 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
15ef0 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
15f00 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
15f10 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20   : nKey2;.  if( 
15f20 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31  nKey1>0 && 1==(1
15f30 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  &(SQLITE_PTR_TO_
15f40 49 4e 54 28 70 4b 65 79 31 29 29 29 20 29 20 75  INT(pKey1))) ) u
15f50 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
15f60 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28  counter++;.  if(
15f70 20 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28   nKey2>0 && 1==(
15f80 31 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  1&(SQLITE_PTR_TO
15f90 5f 49 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20  _INT(pKey2))) ) 
15fa0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
15fb0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63  _counter++;.  rc
15fc0 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
15fd0 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
15fe0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
15ff0 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
16000 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
16010 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
16020 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 61   SQLITE_TCLAPI a
16030 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
16040 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
16050 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16060 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16070 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16080 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16090 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
160a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
160b0 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
160c0 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
160d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
160e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
160f0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
16100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16110 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
16120 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
16130 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
16140 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
16150 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
16160 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
16170 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
16180 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
16190 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
161a0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
161b0 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
161c0 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
161d0 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
161e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
161f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
16200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16210 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
16220 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
16230 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
16240 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
16250 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
16260 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16270 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
16280 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
16290 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
162a0 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
162b0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
162c0 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
162d0 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
162e0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
162f0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
16300 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
16310 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
16320 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
16330 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
16340 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
16350 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
16360 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
16370 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
16380 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
16390 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
163a0 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
163b0 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
163c0 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
163d0 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
163e0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
163f0 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
16400 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
16410 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
16420 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
16430 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
16440 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
16450 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
16460 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
16470 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
16480 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
16490 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
164a0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
164b0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
164c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
164d0 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
164e0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
164f0 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
16500 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
16510 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
16520 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
16530 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
16540 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
16550 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
16560 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
16570 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
16580 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
16590 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
165a0 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
165b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
165c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
165d0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
165e0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
165f0 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
16600 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
16610 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
16620 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
16630 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
16640 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
16650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16660 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
16670 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
16680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16690 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
166a0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
166b0 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
166c0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
166d0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
166e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
166f0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
16700 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
16710 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
16720 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
16730 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
16740 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
16750 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
16760 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
16770 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
16780 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
16790 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
167a0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
167b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
167c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
167d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
167e0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
167f0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
16800 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
16810 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
16820 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16830 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
16840 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
16850 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
16860 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
16870 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
16880 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
16890 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
168a0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
168b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
168c0 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
168d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
168e0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
168f0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
16900 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
16910 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
16920 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
16930 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
16940 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
16950 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
16960 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
16970 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
16980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16990 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
169a0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
169b0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
169c0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
169d0 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
169e0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
169f0 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
16a00 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
16a10 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
16a20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
16a30 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
16a40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
16a50 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
16a60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16a70 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
16a80 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
16a90 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
16aa0 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
16ab0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16ac0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
16ad0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
16ae0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
16af0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
16b00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
16b10 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
16b20 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
16b30 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
16b40 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
16b50 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
16b60 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
16b70 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
16b80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
16b90 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
16ba0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
16bb0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
16bc0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
16bd0 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
16be0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
16bf0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
16c00 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
16c10 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
16c20 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
16c30 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
16c40 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
16c50 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
16c60 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
16c70 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
16c80 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
16c90 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
16ca0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
16cb0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
16cc0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
16cd0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
16ce0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
16cf0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
16d00 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
16d10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
16d20 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
16d30 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
16d40 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
16d50 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
16d60 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
16d70 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
16d80 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
16d90 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
16da0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
16db0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
16dc0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
16dd0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
16de0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
16df0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
16e00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16e10 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
16e20 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
16e30 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
16e40 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
16e50 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
16e60 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
16e70 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
16e80 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
16e90 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
16ea0 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
16eb0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
16ec0 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
16ed0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
16ee0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
16ef0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
16f00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
16f10 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
16f20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
16f30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
16f50 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
16f60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16f70 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
16f80 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
16f90 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
16fa0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
16fb0 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
16fc0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
16fd0 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
16fe0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
16ff0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
17000 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
17010 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
17020 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
17030 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
17040 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
17050 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
17060 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
17070 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
17080 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
17090 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
170a0 4c 41 50 49 20 74 65 73 74 5f 66 75 6e 63 74 69  LAPI test_functi
170b0 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
170c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
170d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
170e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
170f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17100 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
17110 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17120 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
17130 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28   int val;..  if(
17140 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
17150 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
17160 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
17170 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17180 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
17190 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
171a0 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
171b0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
171c0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
171d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
171e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
171f0 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
17200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
17210 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
17220 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
17230 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
17240 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  F8, .        int
17250 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
17260 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a  on_utf8, 0, 0);.
17270 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
17280 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
17290 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
172a0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
172b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
172c0 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
172d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
172e0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
172f0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
17300 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
17310 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  LE, .        int
17320 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
17330 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30  on_utf16le, 0, 0
17340 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
17350 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
17360 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
17370 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
17380 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17390 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
173a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
173b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
173c0 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
173d0 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
173e0 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
173f0 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
17400 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30  ction_utf16be, 0
17410 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
17420 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f  urn TCL_OK;.bad_
17430 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65  args:.  Tcl_Appe
17440 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17450 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17460 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
17470 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17480 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17490 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75  ], 0), " <DB> <u
174a0 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
174b0 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23  utf16be>", 0);.#
174c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
174d0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
174e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
174f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17500 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  :         sqlite
17510 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65  3_test_errstr <e
17520 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54  rr code>.**.** T
17530 65 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67  est that the eng
17540 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74  lish language st
17550 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73  ring equivalents
17560 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f   for sqlite erro
17570 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73  r codes.** are s
17580 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ane. The paramet
17590 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  er is an integer
175a0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
175b0 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
175c0 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  de..** The resul
175d0 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  t is a list of t
175e0 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65  wo elements, the
175f0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
17600 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
17610 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
17620 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67  the english lang
17630 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
17640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17650 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
17660 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69  st_errstr(.  voi
17670 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17680 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17690 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
176a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
176b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
176c0 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e  har *zCode;.  in
176d0 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  t i;.  if( objc!
176e0 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
176f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17700 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72  p, 1, objv, "<er
17710 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d  ror code>");.  }
17720 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f  ..  zCode = Tcl_
17730 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17740 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
17750 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <200; i++){.    
17760 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31  if( 0==strcmp(t1
17770 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43  ErrorName(i), zC
17780 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ode) ) break;.  
17790 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
177a0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
177b0 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
177c0 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  i), 0);.  return
177d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
177e0 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61  * Usage:    brea
177f0 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69  kpoint.**.** Thi
17800 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73  s routine exists
17810 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65   for one purpose
17820 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20   - to provide a 
17830 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a  place to put a.*
17840 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74  * breakpoint wit
17850 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62  h GDB that can b
17860 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e  e triggered usin
17870 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65  g TCL code.  The
17880 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73   use.** for this
17890 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69   is when a parti
178a0 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73  cular test fails
178b0 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34   on (say) the 14
178c0 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a  85th iteration..
178d0 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65  ** In the TCL te
178e0 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61  st script, we ca
178f0 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20  n add code like 
17900 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
17910 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72  if {$i==1485} br
17920 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
17930 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74  hen run testfixt
17940 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67  ure in the debug
17950 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72  ger and wait for
17960 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20   the breakpoint 
17970 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65  to.** fire.  The
17980 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65  n additional bre
17990 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20  akpoints can be 
179a0 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77  set to trace dow
179b0 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74  n the bug..*/.st
179c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
179d0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 72 65 61  TCLAPI test_brea
179e0 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  kpoint(.  void *
179f0 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
17a00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
17a10 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
17a20 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
17a30 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
17a40 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
17a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17a60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
17a70 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
17a80 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
17a90 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
17aa0 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
17ab0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17ac0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;         /* Do 
17ad0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  nothing */.}../*
17ae0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17af0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
17b00 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a  ob  STMT IDX N.*
17b10 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
17b20 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
17b30 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
17b40 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
17b50 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
17b60 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65   IDX is the inde
17b70 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17b80 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17b90 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17ba0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17bb0 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d  s a N-byte zero-
17bc0 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74  filled BLOB to t
17bd0 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
17be0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
17bf0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
17c00 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76  nd_zeroblob(.  v
17c10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17c20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17c30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17c40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17c50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17c60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17c70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17c80 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
17c90 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
17ca0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
17cb0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17cc0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
17cd0 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72  T IDX N");.    r
17ce0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17cf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
17d00 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
17d10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17d20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
17d30 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17d40 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
17d50 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
17d60 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
17d70 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
17d80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17d90 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17da0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
17db0 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
17dc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
17dd0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
17de0 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  zeroblob(pStmt, 
17df0 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
17e00 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
17e10 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
17e20 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
17e30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e40 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
17e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17e70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
17e80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17e90 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
17ea0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20  bind_zeroblob64 
17eb0 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
17ec0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
17ed0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
17ee0 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
17ef0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
17f00 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
17f10 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
17f20 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
17f30 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
17f40 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
17f50 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
17f60 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
17f70 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
17f80 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
17f90 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
17fa0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
17fb0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20  d_zeroblob64(.  
17fc0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17fd0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17fe0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17ff0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18000 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18010 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18020 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
18030 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  ;.  Tcl_WideInt 
18040 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
18050 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
18060 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18070 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
18080 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
18090 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
180a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
180b0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
180c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
180d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
180e0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
180f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18100 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18110 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18120 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
18130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18140 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18150 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
18160 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
18170 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
18180 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
18190 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
181a0 6f 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69  oblob64(pStmt, i
181b0 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
181c0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
181d0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
181e0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
181f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18200 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
18220 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18230 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
18240 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
18250 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18260 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
18270 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18280 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
18290 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54  te3_bind_int  ST
182a0 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
182b0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
182c0 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72  3_bind_int inter
182d0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
182e0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
182f0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
18300 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
18310 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
18320 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
18330 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
18340 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20   binds a 32-bit 
18350 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
18360 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
18370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
18380 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
18390 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69  _bind_int(.  voi
183a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
183b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
183c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
183d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
183e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
183f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18400 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
18410 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e   int value;.  in
18420 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
18430 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
18440 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18450 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18460 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18470 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
18480 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
18490 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
184a0 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
184b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
184c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
184d0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
184e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
184f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18500 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18510 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18520 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18530 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18540 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
18550 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18560 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18570 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18580 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
18590 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
185a0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
185b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
185c0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
185d0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
185e0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
185f0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
18600 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
18610 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
18640 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18650 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18660 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
18670 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64 72     intarray_addr
18680 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    INT  ....**.**
18690 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
186a0 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75  ess of a C-langu
186b0 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32 2d  age array of 32-
186c0 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  bit integers..**
186d0 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
186e0 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20 6f  d the array is o
186f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
18700 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69  loc().  Call thi
18710 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65  s procedure once
18720 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75  .** with no argu
18730 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74  ments in order t
18740 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
18750 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
18760 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a  this procedure.*
18770 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
18780 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e   previous array.
18790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
187a0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
187b0 74 5f 69 6e 74 61 72 72 61 79 5f 61 64 64 72 28  t_intarray_addr(
187c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
187d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
187e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
187f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18800 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18810 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18820 61 74 69 63 20 69 6e 74 20 2a 70 20 3d 20 30 3b  atic int *p = 0;
18830 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
18840 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
18850 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
18860 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
18870 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
18880 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
18890 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
188a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
188b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
188c0 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
188d0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
188e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
188f0 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69   objv[1+i], &p[i
18900 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ]) ){.        sq
18910 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
18920 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20         p = 0;.  
18930 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
18940 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
18950 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63      }.  }  .  Tc
18960 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18970 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
18980 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65  deIntObj((sqlite
18990 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72  3_int64)p));.  r
189a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
189b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 69  /*.** Usage:   i
189c0 6e 74 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e  ntarray_addr  IN
189d0 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  T  ....**.** Ret
189e0 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
189f0 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20  of a C-language 
18a00 61 72 72 61 79 20 6f 66 20 33 32 2d 62 69 74 20  array of 32-bit 
18a10 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  integers..**.** 
18a20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
18a30 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
18a40 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
18a50 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
18a60 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
18a70 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
18a80 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
18a90 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
18aa0 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
18ab0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
18ac0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
18ad0 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
18ae0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
18af0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69 6e  E_TCLAPI test_in
18b00 74 36 34 61 72 72 61 79 5f 61 64 64 72 28 0a 20  t64array_addr(. 
18b10 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18b20 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18b30 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18b40 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18b50 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18b60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
18b70 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
18b80 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69   *p = 0;..  sqli
18b90 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
18ba0 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
18bb0 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
18bc0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
18bd0 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
18be0 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
18bf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
18c00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
18c10 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
18c20 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ++){.      Tcl_W
18c30 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
18c40 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
18c50 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18c60 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 76 29  , objv[1+i], &v)
18c70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18c80 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18c90 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
18ca0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18cb0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
18cc0 20 20 20 20 70 5b 69 5d 20 3d 20 76 3b 0a 20 20      p[i] = v;.  
18cd0 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f    }.  }  .  Tcl_
18ce0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18cf0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
18d00 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f  IntObj((sqlite3_
18d10 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74  int64)p));.  ret
18d20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
18d30 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 64 6f 75  .** Usage:   dou
18d40 62 6c 65 61 72 72 61 79 5f 61 64 64 72 20 20 49  blearray_addr  I
18d50 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65  NT  ....**.** Re
18d60 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
18d70 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65   of a C-language
18d80 20 61 72 72 61 79 20 6f 66 20 64 6f 75 62 6c 65   array of double
18d90 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
18da0 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
18db0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
18dc0 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
18dd0 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
18de0 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
18df0 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
18e00 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
18e10 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
18e20 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
18e30 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
18e40 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
18e50 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
18e60 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
18e70 49 20 74 65 73 74 5f 64 6f 75 62 6c 65 61 72 72  I test_doublearr
18e80 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20  ay_addr(.  void 
18e90 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18ea0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18eb0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18ec0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18ed0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
18ee0 20 69 3b 0a 20 20 73 74 61 74 69 63 20 64 6f 75   i;.  static dou
18ef0 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73  ble *p = 0;..  s
18f00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
18f10 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f    p = 0;.  if( o
18f20 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d  bjc>1 ){.    p =
18f30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
18f40 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f   sizeof(p[0])*(o
18f50 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  bjc-1) );.    if
18f60 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
18f70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66  TCL_ERROR;.    f
18f80 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31  or(i=0; i<objc-1
18f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
18fa0 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  ( Tcl_GetDoubleF
18fb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18fc0 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29  bjv[1+i], &p[i])
18fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18fe0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18ff0 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
19000 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19010 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
19020 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f    }.  }  .  Tcl_
19030 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
19040 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
19050 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f  IntObj((sqlite3_
19060 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74  int64)p));.  ret
19070 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
19080 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 78  .** Usage:   tex
19090 74 61 72 72 61 79 5f 61 64 64 72 20 20 54 45 58  tarray_addr  TEX
190a0 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  T ....**.** Retu
190b0 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
190c0 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61  f a C-language a
190d0 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e  rray of strings.
190e0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
190f0 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69  hold the array i
19100 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
19110 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20  malloc().  Call 
19120 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f  this procedure o
19130 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61  nce.** with no a
19140 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65  rguments in orde
19150 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  r to release mem
19160 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  ory.  Each call 
19170 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  to this procedur
19180 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  e.** overwrites 
19190 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72  the previous arr
191a0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
191b0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
191c0 74 65 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61  test_textarray_a
191d0 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ddr(.  void * cl
191e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
191f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19200 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19210 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19220 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  v[].){.  int i;.
19230 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d    static int n =
19240 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   0;.  static cha
19250 72 20 2a 2a 70 20 3d 20 30 3b 0a 0a 20 20 66 6f  r **p = 0;..  fo
19260 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
19270 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 5b   sqlite3_free(p[
19280 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  i]);.  sqlite3_f
19290 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b  ree(p);.  p = 0;
192a0 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b  .  if( objc>1 ){
192b0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
192c0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
192d0 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29  p[0])*(objc-1) )
192e0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
192f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19300 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  R;.    for(i=0; 
19310 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a  i<objc-1; i++){.
19320 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 73 71 6c        p[i] = sql
19330 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
19340 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
19350 28 6f 62 6a 76 5b 31 2b 69 5d 29 29 3b 0a 20 20  (objv[1+i]));.  
19360 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 6f 62    }.  }.  n = ob
19370 6a 63 2d 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  jc-1;.  Tcl_SetO
19380 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19390 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
193a0 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  bj((sqlite3_int6
193b0 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  4)p));.  return 
193c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
193d0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
193e0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53  e3_bind_int64  S
193f0 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
19400 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
19410 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e  e3_bind_int64 in
19420 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
19430 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
19440 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
19450 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
19460 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
19470 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
19480 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
19490 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
194a0 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
194b0 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
194c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
194d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
194e0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
194f0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19500 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19510 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19520 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19530 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19540 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
19550 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
19560 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  dx;.  Tcl_WideIn
19570 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
19580 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
19590 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
195a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
195b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
195c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
195d0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
195e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
195f0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
19600 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
19610 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19620 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19630 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
19640 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
19650 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19660 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
19670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
19680 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
19690 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
196a0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
196b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
196c0 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
196d0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
196e0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
196f0 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
19700 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
19710 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
19720 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
19730 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
19740 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19750 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
19760 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
19770 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19790 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
197a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
197b0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
197c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
197d0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
197e0 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
197f0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
19800 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
19810 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
19820 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
19830 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
19840 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
19850 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
19860 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
19870 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
19880 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
19890 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
198a0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
198b0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
198c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
198d0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
198e0 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
198f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19900 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19910 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19920 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19930 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19940 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19950 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
19960 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
19970 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
19980 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
19990 61 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  al;.  int i;.  s
199a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
199b0 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
199c0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
199d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
199e0 70 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20  pecial floating 
199f0 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20  point value */. 
19a00 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
19a10 69 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70  iUpper;   /* Upp
19a20 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20  er 32 bits */.  
19a30 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
19a40 4c 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65  Lower;   /* Lowe
19a50 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d  r 32 bits */.  }
19a60 20 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20   aSpecialFp[] = 
19a70 7b 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20  {.    {  "NaN", 
19a80 20 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c       0x7fffffff,
19a90 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
19aa0 20 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20     {  "SNaN",   
19ab0 20 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78    0x7ff7ffff, 0x
19ac0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
19ad0 7b 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30  {  "-NaN",     0
19ae0 78 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66  xffffffff, 0xfff
19af0 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
19b00 22 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66  "-SNaN",    0xff
19b10 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  f7ffff, 0xffffff
19b20 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49  ff },.    {  "+I
19b30 6e 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30  nf",     0x7ff00
19b40 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
19b50 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22  },.    {  "-Inf"
19b60 2c 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30  ,     0xfff00000
19b70 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
19b80 20 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22      {  "Epsilon"
19b90 2c 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30  ,  0x00000000, 0
19ba0 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20  x00000001 },.   
19bb0 20 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20   {  "-Epsilon", 
19bc0 30 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x80000000, 0x00
19bd0 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
19be0 20 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37   "NaN0",     0x7
19bf0 66 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff80000, 0x00000
19c00 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  000 },.    {  "-
19c10 4e 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38  NaN0",    0xfff8
19c20 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
19c30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
19c40 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
19c50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19c60 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19c70 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19c80 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
19c90 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
19ca0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
19cb0 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
19cc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19cd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19ce0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19cf0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19d00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19d10 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
19d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19d30 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19d40 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19d50 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
19d60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19d70 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63  OR;..  /* Interc
19d80 65 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22  ept the string "
19d90 4e 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74  NaN" and generat
19da0 65 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f  e a NaN value fo
19db0 72 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f  r it..  ** All o
19dc0 74 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65  ther strings are
19dd0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
19de0 74 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  to Tcl_GetDouble
19df0 46 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20  FromObj()..  ** 
19e00 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
19e10 6d 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e  mObj() should un
19e20 64 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62  derstand "NaN" b
19e30 75 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  ut some versions
19e40 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20  .  ** contain a 
19e50 62 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c  bug..  */.  zVal
19e60 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
19e70 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72  (objv[3]);.  for
19e80 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
19e90 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f  SpecialFp)/sizeo
19ea0 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29  f(aSpecialFp[0])
19eb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
19ec0 73 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46  strcmp(aSpecialF
19ed0 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c  p[i].zName, zVal
19ee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
19ef0 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a  lite3_uint64 x;.
19f00 20 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69        x = aSpeci
19f10 61 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a  alFp[i].iUpper;.
19f20 20 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a        x <<= 32;.
19f30 20 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63        x |= aSpec
19f40 69 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b  ialFp[i].iLower;
19f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19f60 69 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20  izeof(value)==8 
19f70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19f80 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b   sizeof(x)==8 );
19f90 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
19fa0 61 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20  alue, &x, 8);.  
19fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19fc0 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69  .  }.  if( i>=si
19fd0 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29  zeof(aSpecialFp)
19fe0 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  /sizeof(aSpecial
19ff0 46 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20  Fp[0]) &&.      
1a000 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
1a010 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a020 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
1a030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1a040 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a050 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
1a060 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
1a070 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
1a080 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1a090 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
1a0a0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
1a0b0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1a0c0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
1a0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a0e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a0f0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
1a100 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a110 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1a120 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53  te3_bind_null  S
1a130 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  TMT N.**.** Test
1a140 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
1a150 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65  d_null interface
1a160 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
1a170 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
1a180 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
1a190 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
1a1a0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
1a1b0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
1a1c0 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
1a1d0 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65  ds a NULL to the
1a1e0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
1a1f0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1a200 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
1a210 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
1a220 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a230 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a240 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1a250 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1a260 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1a270 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1a280 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
1a290 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1a2a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1a2b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a2c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a2d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a2e0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
1a2f0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
1a300 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
1a310 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
1a320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a330 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1a340 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1a350 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1a360 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1a370 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a380 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1a390 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a3a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1a3b0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
1a3c0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1a3d0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
1a3e0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
1a3f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a400 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a410 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
1a420 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
1a430 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1a440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1a460 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
1a470 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a480 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1a490 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1a4a0 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
1a4b0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
1a4c0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
1a4d0 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
1a4e0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
1a4f0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1a500 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
1a510 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
1a520 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
1a530 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
1a540 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
1a550 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
1a560 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
1a570 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
1a580 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
1a590 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
1a5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1a5b0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1a5c0 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
1a5d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a5e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a5f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1a600 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1a610 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1a620 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1a630 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
1a640 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
1a650 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
1a660 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1a670 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
1a680 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a690 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a6a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a6b0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
1a6c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
1a6d0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
1a6e0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
1a6f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a700 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a710 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1a720 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1a730 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a740 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1a750 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a760 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1a770 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1a780 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
1a790 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a7a0 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
1a7b0 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
1a7c0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1a7d0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
1a7e0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1a7f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1a800 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
1a810 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a820 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1a830 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
1a840 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
1a850 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
1a860 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
1a870 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1a880 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
1a890 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
1a8a0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1a8b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
1a8c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a8d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a8e0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
1a8f0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
1a900 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a910 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a920 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a930 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a940 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1a950 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
1a960 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
1a970 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
1a980 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
1a990 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
1a9a0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
1a9b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
1a9c0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
1a9d0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
1a9e0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
1a9f0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
1aa00 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
1aa10 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
1aa20 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
1aa30 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
1aa40 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
1aa50 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
1aa60 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1aa70 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
1aa80 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f  ind_text16(.  vo
1aa90 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1aaa0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1aab0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1aac0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1aad0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1aae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1aaf0 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
1ab00 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ab10 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
1ab20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
1ab30 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
1ab40 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
1ab50 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d  void*) = (objc==
1ab60 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a  6?SQLITE_STATIC:
1ab70 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1ab80 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  );.  Tcl_Obj *oS
1ab90 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  tmt    = objv[ob
1aba0 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-4];.  Tcl_Obj
1abb0 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a   *oN       = obj
1abc0 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c  v[objc-3];.  Tcl
1abd0 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d  _Obj *oString  =
1abe0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20   objv[objc-2];. 
1abf0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73   Tcl_Obj *oBytes
1ac00 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31     = objv[objc-1
1ac10 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1ac20 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20  5 && objc!=6){. 
1ac30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ac40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ac50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ac60 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1ac70 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1ac80 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1ac90 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
1aca0 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  UE BYTES", 0);. 
1acb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1acc0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1acd0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1ace0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1acf0 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53  ring(oStmt), &pS
1ad00 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1ad10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1ad20 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1ad30 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64  (interp, oN, &id
1ad40 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
1ad50 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
1ad60 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1ad70 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1ad80 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69  oString, 0);.  i
1ad90 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1ada0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79  mObj(interp, oBy
1adb0 74 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72  tes, &bytes) ) r
1adc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1add0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1ade0 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74  _bind_text16(pSt
1adf0 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a  mt, idx, (void *
1ae00 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78  )value, bytes, x
1ae10 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Del);.  if( sqli
1ae20 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1ae30 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
1ae40 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
1ae50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ae60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ae70 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
1ae80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ae90 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
1aea0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
1aeb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aec0 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
1aed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1aee0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1aef0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1af00 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1af10 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61  _bind_blob ?-sta
1af20 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41  tic? STMT N DATA
1af30 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
1af40 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
1af50 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63  nd_blob interfac
1af60 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
1af70 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1af80 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
1af90 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
1afa0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
1afb0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
1afc0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
1afd0 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68  nds a BLOB to th
1afe0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
1aff0 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62   BLOB is BYTES b
1b000 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
1b010 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1b020 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
1b030 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
1b040 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b050 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b060 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b070 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b080 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1b090 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b0a0 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 2c 20 69 64  t;.  int len, id
1b0b0 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
1b0c0 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
1b0d0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1b0e0 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
1b0f0 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
1b100 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
1b110 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
1b120 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
1b130 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b140 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b150 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b160 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
1b170 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1b180 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
1b190 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
1b1a0 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
1b1b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b1c0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1b1d0 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
1b1e0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
1b1f0 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
1b200 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
1b210 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1b220 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1b230 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1b240 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1b250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b260 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1b270 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1b280 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
1b290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b2a0 0a 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ..  value = (cha
1b2b0 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
1b2c0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
1b2d0 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  3], &len);.  if(
1b2e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1b2f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1b300 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
1b310 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b320 0a 20 20 69 66 28 20 62 79 74 65 73 3e 6c 65 6e  .  if( bytes>len
1b330 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
1b340 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[200];.    sqli
1b350 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1b360 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
1b370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b380 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 75 73        "cannot us
1b390 65 20 25 64 20 62 6c 6f 62 20 62 79 74 65 73 2c  e %d blob bytes,
1b3a0 20 68 61 76 65 20 25 64 22 2c 20 62 79 74 65 73   have %d", bytes
1b3b0 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  , len);.    Tcl_
1b3c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b3d0 65 72 70 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a  erp, zBuf, -1);.
1b3e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b3f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
1b400 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  = sqlite3_bind_b
1b410 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  lob(pStmt, idx, 
1b420 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
1b430 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66  estructor);.  if
1b440 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1b450 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
1b460 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
1b470 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b480 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
1b490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b4a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b4b0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
1b4c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1b4d0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1b4e0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
1b4f0 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a  r_count  STMT.**
1b500 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b510 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72  umber of wildcar
1b520 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ds in the given 
1b530 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
1b540 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1b550 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
1b560 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
1b570 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b580 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b590 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b5a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b5b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b5c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1b5d0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1b5e0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1b5f0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1b600 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1b610 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
1b620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
1b640 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1b650 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b660 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1b670 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1b680 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1b690 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b6a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1b6b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
1b6c0 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
1b6d0 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
1b6e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b6f0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1b700 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1b710 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
1b720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b730 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
1b740 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
1b750 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
1b760 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
1b770 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
1b780 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
1b790 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
1b7a0 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
1b7b0 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
1b7c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1b7d0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
1b7e0 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
1b7f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b800 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b810 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b820 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b830 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b840 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1b850 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1b860 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
1b870 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
1b880 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b890 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
1b8a0 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
1b8b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b8c0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1b8d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1b8e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b8f0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1b900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b910 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1b920 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1b930 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20   objv[2], &i) ) 
1b940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b950 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1b960 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
1b970 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1b980 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64  Obj(sqlite3_bind
1b990 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
1b9a0 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29  pStmt,i),-1).  )
1b9b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b9c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b9d0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
1b9e0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1b9f0 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a  x  STMT  NAME.**
1ba00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1ba10 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64  ndex of the wild
1ba20 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45  card called NAME
1ba30 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1ba40 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75  here is.** no su
1ba50 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  ch wildcard..*/.
1ba60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1ba70 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
1ba80 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
1ba90 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ex(.  void * cli
1baa0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1bab0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bac0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bad0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bae0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1baf0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1bb00 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1bb10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1bb20 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1bb30 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22  bjv, "STMT NAME"
1bb40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bb50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1bb60 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1bb70 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1bb80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bb90 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1bba0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bbb0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1bbc0 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54  (interp, .     T
1bbd0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20  cl_NewIntObj(.  
1bbe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1bbf0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1bc00 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53  x(pStmt,Tcl_GetS
1bc10 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a  tring(objv[2])).
1bc20 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65       ).  );.  re
1bc30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bc40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1bc50 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
1bc60 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f  dings STMT.**.*/
1bc70 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1bc80 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
1bc90 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20  lear_bindings(. 
1bca0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1bcb0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1bcc0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1bcd0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1bce0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1bcf0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1bd00 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1bd10 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1bd20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1bd30 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1bd40 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1bd50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bd60 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
1bd70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bd80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bd90 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1bda0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bdb0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
1bdc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1bdd0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1bde0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
1bdf0 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  ngs(pStmt)));.  
1be00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1be10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1be20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d   sqlite3_sleep M
1be30 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73  ILLISECONDS.*/.s
1be40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1be50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6c 65  _TCLAPI test_sle
1be60 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
1be70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1be80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1be90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bea0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1beb0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
1bec0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1bed0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1bee0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1bef0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
1bf00 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
1bf10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bf20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
1bf30 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1bf40 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
1bf50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1bf60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1bf70 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1bf80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1bf90 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
1bfa0 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
1bfb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bfc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1bfd0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1bfe0 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
1bff0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
1c000 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1c010 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1c020 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1c030 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
1c040 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
1c050 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
1c060 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1c070 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65   test_ex_errcode
1c080 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c090 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c0a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c0b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c0c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c0d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1c0e0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1c0f0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c100 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c110 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1c120 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c130 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1c140 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1c150 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
1c160 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c170 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c180 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1c190 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c1a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c1b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1c1c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1c1d0 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  = sqlite3_extend
1c1e0 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  ed_errcode(db);.
1c1f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c200 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1c210 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1c220 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1c230 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1c240 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c250 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a  3_errcode DB.**.
1c260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74  ** Return the st
1c270 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
1c280 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
1c290 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
1c2a0 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   API.** error co
1c2b0 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45  de. e.g. "SQLITE
1c2c0 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74  _ERROR"..*/.stat
1c2d0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1c2e0 4c 41 50 49 20 74 65 73 74 5f 65 72 72 63 6f 64  LAPI test_errcod
1c2f0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1c300 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c310 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c320 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c330 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c340 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
1c350 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
1c360 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c370 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c380 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c390 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c3a0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1c3b0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1c3c0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
1c3d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c3e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c3f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c400 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c410 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c420 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1c430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1c440 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1c450 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70  de(db);.  Tcl_Ap
1c460 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c470 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1c480 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1c490 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c4a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c4b0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1c4c0 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  g DB.**.** Retur
1c4d0 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70  ns the UTF-8 rep
1c4e0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1c4f0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1c500 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a   string for the.
1c510 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  ** most recent s
1c520 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c  qlite3_* API cal
1c530 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1c540 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1c550 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
1c560 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c570 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c580 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c590 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c5a0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c5b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1c5c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
1c5d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1c5e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c5f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c600 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c610 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1c620 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c630 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1c640 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1c650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c660 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1c670 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c680 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c690 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1c6a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1c6b0 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
1c6c0 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
1c6d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c6e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1c6f0 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
1c700 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
1c710 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c720 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
1c730 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
1c740 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
1c750 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
1c760 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
1c770 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
1c780 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
1c790 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1c7a0 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
1c7b0 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
1c7c0 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
1c7d0 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
1c7e0 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
1c7f0 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
1c800 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
1c810 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
1c820 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
1c830 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1c840 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72  E_TCLAPI test_er
1c850 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a  rmsg16(.  void *
1c860 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c870 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c880 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c890 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c8a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1c8b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1c8c0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1c8d0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1c8e0 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zErr;.  const c
1c8f0 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79  har *z;.  int by
1c900 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  tes = 0;..  if( 
1c910 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c920 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c930 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c940 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c950 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1c960 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c970 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
1c980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c990 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c9a0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1c9b0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c9c0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1c9d0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1c9e0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
1c9f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
1ca00 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72  6(db);.  if( zEr
1ca10 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72  r ){.    z = zEr
1ca20 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73  r;.    for(bytes
1ca30 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20  =0; z[bytes] || 
1ca40 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65  z[bytes+1]; byte
1ca50 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63  s+=2){}.  }.  Tc
1ca60 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1ca70 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
1ca80 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
1ca90 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66   bytes));.#endif
1caa0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1cab0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1cac0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1cad0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1cae0 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
1caf0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1cb00 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1cb10 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1cb20 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1cb30 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1cb40 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1cb50 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1cb60 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1cb70 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1cb80 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1cb90 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1cba0 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1cbb0 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1cbc0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1cbd0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1cbe0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1cbf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cc00 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1cc10 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f  st_prepare(.  vo
1cc20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cc30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1cc40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cc50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cc60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1cc70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1cc80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
1cc90 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
1cca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
1ccb0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
1ccc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1ccd0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1cce0 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
1ccf0 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
1cd00 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1cd10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1cd20 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1cd30 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1cd40 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1cd50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cd60 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1cd70 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20  tes ?tailvar?", 
1cd80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1cd90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1cda0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1cdb0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1cdc0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1cdd0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1cde0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1cdf0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1ce00 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
1ce10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1ce20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1ce30 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1ce40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ce50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ce60 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c  prepare(db, zSql
1ce70 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1ce80 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1ce90 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65  l : 0);.  Tcl_Re
1cea0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
1ceb0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1cec0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1ced0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1cee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1cef0 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f    if( zTail && o
1cf00 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1cf10 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1cf20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
1cf30 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
1cf40 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
1cf50 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e   if( (int)strlen
1cf60 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b  (zTail)<bytes ){
1cf70 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 28  .      bytes = (
1cf80 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
1cf90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
1cfa0 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
1cfb0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
1cfc0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1cfd0 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20  (zTail, bytes), 
1cfe0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1cff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d000 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
1d010 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
1d020 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1d030 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
1d040 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
1d050 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d060 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1d070 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1d080 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
1d090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d0a0 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1d0b0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1d0c0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1d0d0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1d0e0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1d0f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d100 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d110 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1d120 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1d130 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d140 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d150 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20  3_prepare_v2 DB 
1d160 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1d170 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
1d180 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1d190 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1d1a0 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1d1b0 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1d1c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1d1d0 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1d1e0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1d1f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1d200 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1d210 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1d220 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1d230 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1d240 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1d250 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1d260 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1d270 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1d280 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
1d290 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d2a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d2b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d2c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d2d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d2e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1d2f0 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
1d300 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
1d310 43 6f 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Copy = 0;       
1d320 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c           /* mall
1d330 6f 63 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71  oc() copy of zSq
1d340 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73  l */.  int bytes
1d350 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d360 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e  zTail = 0;.  con
1d370 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c  st char **pzTail
1d380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1d390 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1d3a0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
1d3b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1d3c0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1d3d0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1d3e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d3f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1d400 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1d410 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1d420 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1d430 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
1d440 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
1d450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d460 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1d470 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1d480 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1d490 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1d4a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d4b0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1d4c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1d4d0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
1d4e0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d4f0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
1d500 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1d510 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
1d520 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20  nstead of using 
1d530 7a 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d  zSql directly, m
1d540 61 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20  ake a copy into 
1d550 61 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65  a buffer obtaine
1d560 64 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  d.  ** directly 
1d570 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54  from malloc(). T
1d580 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61  he idea is to ma
1d590 6b 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72  ke it easier for
1d5a0 20 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74   valgrind.  ** t
1d5b0 6f 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76  o spot buffer ov
1d5c0 65 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69  erreads.  */.  i
1d5d0 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
1d5e0 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f     zCopy = mallo
1d5f0 63 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65  c(bytes);.    me
1d600 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
1d610 2c 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  , bytes);.  }els
1d620 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  e{.    int n = (
1d630 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29  int)strlen(zSql)
1d640 20 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20   + 1;.    zCopy 
1d650 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20  = malloc(n);.   
1d660 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
1d670 53 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70  Sql, n);.  }.  p
1d680 7a 54 61 69 6c 20 3d 20 6f 62 6a 63 3e 3d 35 20  zTail = objc>=5 
1d690 3f 20 26 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20  ? &zTail : 0;.  
1d6a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1d6b0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70  pare_v2(db, zCop
1d6c0 79 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  y, bytes, &pStmt
1d6d0 2c 20 70 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28  , pzTail);.  if(
1d6e0 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1d6f0 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a  zTail = &zSql[(z
1d700 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a  Tail - zCopy)];.
1d710 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 70 79    }.  free(zCopy
1d720 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d  );..  assert(rc=
1d730 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1d740 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52  tmt==0);.  Tcl_R
1d750 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
1d760 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
1d770 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1d780 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1d790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d7a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d7b0 45 5f 4f 4b 20 26 26 20 6f 62 6a 63 3e 3d 35 20  E_OK && objc>=5 
1d7c0 26 26 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  && zTail ){.    
1d7d0 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
1d7e0 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
1d7f0 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69  tes - (int)(zTai
1d800 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
1d810 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1d820 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1d830 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ], 0, Tcl_NewStr
1d840 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79  ingObj(zTail, by
1d850 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  tes), 0);.  }.  
1d860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d870 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1d880 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
1d890 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1d8a0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
1d8b0 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
1d8c0 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
1d8d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d8e0 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
1d8f0 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
1d900 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d910 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d920 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1d930 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1d940 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1d950 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1d960 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d970 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
1d980 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d990 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
1d9a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d9b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d9c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1d9d0 76 33 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  v3 DB sql bytes 
1d9e0 66 6c 61 67 73 20 3f 74 61 69 6c 76 61 72 3f 0a  flags ?tailvar?.
1d9f0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1da00 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1da10 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1da20 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1da30 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1da40 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1da50 20 61 6e 64 20 66 6c 61 67 73 20 3c 66 6c 61 67   and flags <flag
1da60 73 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  s>. The paramete
1da70 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 0a 2a  r <tailval> is.*
1da80 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1da90 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
1daa0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
1dab0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
1dac0 6e 20 6f 66 0a 2a 2a 20 3c 73 71 6c 3e 20 28 69  n of.** <sql> (i
1dad0 66 20 61 6e 79 29 2e 20 41 20 53 54 4d 54 20 68  f any). A STMT h
1dae0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
1daf0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1db00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1db10 65 73 74 5f 70 72 65 70 61 72 65 5f 76 33 28 0a  est_prepare_v3(.
1db20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1db30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1db40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1db50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1db60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1db70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1db80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1db90 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Sql;.  char *zCo
1dba0 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  py = 0;         
1dbb0 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63         /* malloc
1dbc0 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20  () copy of zSql 
1dbd0 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 2c 20  */.  int bytes, 
1dbe0 66 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  flags;.  const c
1dbf0 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
1dc00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
1dc10 7a 54 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  zTail;.  sqlite3
1dc20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1dc30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1dc40 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
1dc50 69 66 28 20 6f 62 6a 63 21 3d 36 20 26 26 20 6f  if( objc!=6 && o
1dc60 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
1dc70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1dc80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1dc90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1dca0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1dcb0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1dcc0 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1dcd0 74 65 73 20 66 6c 61 67 73 20 74 61 69 6c 76 61  tes flags tailva
1dce0 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
1dcf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dd00 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1dd10 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1dd20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1dd30 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1dd40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dd50 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
1dd60 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
1dd70 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1dd80 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1dd90 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1dda0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ddb0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1ddc0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1ddd0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 66 6c  rp, objv[4], &fl
1dde0 61 67 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  ags) ) return TC
1ddf0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
1de00 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20  nstead of using 
1de10 7a 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d  zSql directly, m
1de20 61 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20  ake a copy into 
1de30 61 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65  a buffer obtaine
1de40 64 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  d.  ** directly 
1de50 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54  from malloc(). T
1de60 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61  he idea is to ma
1de70 6b 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72  ke it easier for
1de80 20 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74   valgrind.  ** t
1de90 6f 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76  o spot buffer ov
1dea0 65 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69  erreads.  */.  i
1deb0 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
1dec0 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f     zCopy = mallo
1ded0 63 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65  c(bytes);.    me
1dee0 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
1def0 2c 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  , bytes);.  }els
1df00 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  e{.    int n = (
1df10 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29  int)strlen(zSql)
1df20 20 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20   + 1;.    zCopy 
1df30 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20  = malloc(n);.   
1df40 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
1df50 53 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70  Sql, n);.  }.  p
1df60 7a 54 61 69 6c 20 3d 20 6f 62 6a 63 3e 3d 36 20  zTail = objc>=6 
1df70 3f 20 26 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20  ? &zTail : 0;.  
1df80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1df90 70 61 72 65 5f 76 33 28 64 62 2c 20 7a 43 6f 70  pare_v3(db, zCop
1dfa0 79 2c 20 62 79 74 65 73 2c 20 28 75 6e 73 69 67  y, bytes, (unsig
1dfb0 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 26 70  ned int)flags,&p
1dfc0 53 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20  Stmt,pzTail);.  
1dfd0 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7a  free(zCopy);.  z
1dfe0 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54  Tail = &zSql[(zT
1dff0 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a  ail - zCopy)];..
1e000 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1e010 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1e020 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74  =0);.  Tcl_Reset
1e030 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1e040 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1e050 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
1e060 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
1e070 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1e080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e090 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a   && zTail && obj
1e0a0 63 3e 3d 36 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=6 ){.    if( 
1e0b0 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
1e0c0 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
1e0d0 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53  - (int)(zTail-zS
1e0e0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ql);.    }.    T
1e0f0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1e100 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 30  terp, objv[5], 0
1e110 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1e120 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
1e130 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1e140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1e160 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  mt==0 );.    sql
1e170 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1e180 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
1e190 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
1e1a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e1b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1e1c0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
1e1d0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
1e1e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e1f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1e200 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1e210 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1e220 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1e230 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1e240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e250 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e260 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1e270 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
1e280 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e290 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e2a0 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
1e2b0 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e  134 DB.**.** Gen
1e2c0 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64  erate a prepared
1e2d0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
1e2e0 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e   zero-byte strin
1e2f0 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66  g as a test.** f
1e300 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e  or ticket #3134.
1e310 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f    The string sho
1e320 75 6c 64 20 62 65 20 70 72 65 63 65 64 65 64 20  uld be preceded 
1e330 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a  by a zero byte..
1e340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1e350 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1e360 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
1e370 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e380 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e390 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e3a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e3b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e3c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1e3d0 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  b;.  static cons
1e3e0 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20  t char zSql[] = 
1e3f0 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a  "\000SELECT 1";.
1e400 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e410 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1e420 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
1e430 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1e440 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1e450 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e460 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e470 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e480 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1e490 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1e4a0 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1e4b0 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
1e4c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e4d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1e4e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1e4f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e500 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1e510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e520 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1e530 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1e540 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c  db, &zSql[1], 0,
1e550 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61   &pStmt, 0);.  a
1e560 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
1e570 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
1e580 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1e590 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1e5a0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1e5b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e5c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e5d0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1e5e0 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
1e5f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e600 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
1e610 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20   zBuf, "(%d) ", 
1e620 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
1e630 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e640 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
1e650 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
1e660 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e670 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1e680 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
1e690 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1e6a0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1e6b0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1e6c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e6d0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
1e6e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e6f0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
1e700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e720 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1e730 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  16 DB sql bytes 
1e740 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f  tailvar.**.** Co
1e750 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1e760 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1e770 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1e780 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1e790 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1e7a0 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
1e7b0 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
1e7c0 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
1e7d0 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
1e7e0 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
1e7f0 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
1e800 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
1e810 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
1e820 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
1e830 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e840 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1e850 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70 61 72  LAPI test_prepar
1e860 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
1e870 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e880 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e890 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1e8a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e8b0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1e8c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1e8d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e8e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
1e8f0 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
1e900 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
1e910 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
1e920 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
1e930 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1e940 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
1e950 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1e960 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
1e970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
1e980 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
1e990 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
1e9a0 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
1e9b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
1e9c0 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
1e9d0 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
1e9e0 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1e9f0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1ea00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ea10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ea20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ea30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1ea40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1ea50 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1ea60 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1ea70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ea80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ea90 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1eaa0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1eab0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1eac0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1ead0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1eae0 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1eaf0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
1eb00 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
1eb10 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1eb20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1eb30 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1eb40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1eb50 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1eb60 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20  3_prepare16(db, 
1eb70 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1eb80 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1eb90 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1eba0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1ebb0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1ebc0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1ebd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1ebe0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1ebf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1ec00 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1ec10 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1ec20 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1ec30 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28   objlen - (int)(
1ec40 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
1ec50 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
1ec60 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
1ec70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1ec80 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
1ec90 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
1eca0 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
1ecb0 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1ecc0 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1ecd0 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1ece0 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1ecf0 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
1ed00 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1ed10 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1ed20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1ed30 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1ed40 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1ed50 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1ed60 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1ed70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ed80 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1ed90 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1eda0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1edb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1edc0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1edd0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ede0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1edf0 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71  epare16_v2 DB sq
1ee00 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1ee10 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
1ee20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
1ee30 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
1ee40 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
1ee50 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
1ee60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
1ee70 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
1ee80 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
1ee90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
1eea0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
1eeb0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
1eec0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
1eed0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
1eee0 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
1eef0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
1ef00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1ef10 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1ef20 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
1ef30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ef40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ef50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ef60 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1ef70 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ef80 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1ef90 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1efa0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1efb0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1efc0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1efd0 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1efe0 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1eff0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1f000 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1f010 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1f020 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1f030 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1f040 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1f050 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1f060 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1f070 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1f080 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1f090 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1f0a0 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1f0b0 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1f0c0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1f0d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f0e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1f0f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1f100 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1f110 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1f120 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1f130 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1f140 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f150 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f160 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f170 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1f180 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1f190 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f1a0 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1f1b0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1f1c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1f1d0 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1f1e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1f1f0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1f200 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1f210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1f220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1f230 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20  repare16_v2(db, 
1f240 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1f250 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1f260 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1f270 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1f280 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1f290 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1f2a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1f2b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1f2c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1f2d0 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1f2e0 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1f2f0 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1f300 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28   objlen - (int)(
1f310 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
1f320 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
1f330 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
1f340 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f350 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
1f360 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
1f370 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
1f380 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1f390 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1f3a0 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1f3b0 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1f3c0 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
1f3d0 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1f3e0 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1f3f0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1f400 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f410 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1f420 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1f430 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1f440 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f450 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1f460 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1f470 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1f480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1f490 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1f4a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f4b0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
1f4c0 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74  en filename ?opt
1f4d0 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74  ions-list?.*/.st
1f4e0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1f4f0 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e  TCLAPI test_open
1f500 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f510 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f520 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f530 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f540 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f550 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1f560 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73   *zFilename;.  s
1f570 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
1f580 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1f590 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
1f5a0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
1f5b0 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =1 ){.    Tcl_Ap
1f5c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f5d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1f5e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1f5f0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1f600 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1f610 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
1f620 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
1f630 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f640 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
1f650 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f  ename = objc>1 ?
1f660 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f670 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73  bjv[1]) : 0;.  s
1f680 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
1f690 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
1f6a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1f6b0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1f6c0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1f6d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f6e0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1f6f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f700 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1f710 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f720 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f730 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45  te3_open_v2 FILE
1f740 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a  NAME FLAGS VFS.*
1f750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1f760 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1f770 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20  open_v2(.  void 
1f780 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1f790 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f7a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1f7b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f7c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1f7d0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1f7e0 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
1f7f0 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c   *zVfs;.  int fl
1f800 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ags = 0;.  sqlit
1f810 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1f820 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1f830 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67  0];..  int nFlag
1f840 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  ;.  Tcl_Obj **ap
1f850 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Flag;.  int i;..
1f860 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
1f870 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1f880 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1f890 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
1f8a0 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20   FLAGS VFS");.  
1f8b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f8c0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e  OR;.  }.  zFilen
1f8d0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1f8e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
1f8f0 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1f900 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
1f910 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78   if( zVfs[0]==0x
1f920 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a  00 ) zVfs = 0;..
1f930 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
1f940 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
1f950 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1f960 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b  nFlag, &apFlag);
1f970 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1f980 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61   for(i=0; i<nFla
1f9a0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
1f9b0 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75   iFlag;.    stru
1f9c0 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20  ct OpenFlag {.  
1f9d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f9e0 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74  zFlag;.      int
1f9f0 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c   flag;.    } aFl
1fa00 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ag[] = {.      {
1fa10 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   "SQLITE_OPEN_RE
1fa20 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f  ADONLY", SQLITE_
1fa30 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
1fa40 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fa50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22  _OPEN_READWRITE"
1fa60 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1fa70 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20  ADWRITE },.     
1fa80 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1fa90 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f  CREATE", SQLITE_
1faa0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
1fab0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1fac0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1fad0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1fae0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c  DELETEONCLOSE },
1faf0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fb00 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22  _OPEN_EXCLUSIVE"
1fb10 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  , SQLITE_OPEN_EX
1fb20 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20  CLUSIVE },.     
1fb30 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1fb40 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49  AUTOPROXY", SQLI
1fb50 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
1fb60 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1fb70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1fb80 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1fb90 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20  MAIN_DB },.     
1fba0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1fbb0 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45  TEMP_DB", SQLITE
1fbc0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c  _OPEN_TEMP_DB },
1fbd0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fbe0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1fbf0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1fc00 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c  _TRANSIENT_DB },
1fc10 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fc20 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1fc30 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1fc40 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _MAIN_JOURNAL },
1fc50 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fc60 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1fc70 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1fc80 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _TEMP_JOURNAL },
1fc90 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fca0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1fcb0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
1fcc0 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  UBJOURNAL },.   
1fcd0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1fce0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1fcf0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1fd00 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  ASTER_JOURNAL },
1fd10 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fd20 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20  _OPEN_NOMUTEX", 
1fd30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1fd40 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1fd50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1fd60 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f  MUTEX", SQLITE_O
1fd70 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c  PEN_FULLMUTEX },
1fd80 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fd90 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1fda0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1fdb0 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
1fdc0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1fdd0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
1fde0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
1fdf0 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
1fe00 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1fe10 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45  PEN_WAL", SQLITE
1fe20 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20  _OPEN_WAL },.   
1fe30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1fe40 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f  N_URI", SQLITE_O
1fe50 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20  PEN_URI },.     
1fe60 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
1fe70 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
1fe80 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
1fe90 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c  uct(interp, apFl
1fea0 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69  ag[i], aFlag, si
1feb0 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20  zeof(aFlag[0]), 
1fec0 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c  .        "flag",
1fed0 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29   0, &iFlag.    )
1fee0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  ;.    if( rc!=TC
1fef0 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1ff00 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61  ;.    flags |= a
1ff10 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67  Flag[iFlag].flag
1ff20 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1ff30 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46  lite3_open_v2(zF
1ff40 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  ilename, &db, fl
1ff50 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66  ags, zVfs);.  if
1ff60 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1ff70 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1ff80 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1ff90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ffa0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1ffb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1ffc0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1ffd0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ffe0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1fff0 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
20000 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
20010 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
20020 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 31 36 28  API test_open16(
20030 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20040 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20050 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20060 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20070 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20080 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
20090 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63  E_OMIT_UTF16.  c
200a0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
200b0 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  name;.  sqlite3 
200c0 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  *db;.  char zBuf
200d0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
200e0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
200f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20100 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
20110 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
20120 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
20130 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
20140 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f  ]), " filename o
20150 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29  ptions-list", 0)
20160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20170 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
20180 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  Filename = Tcl_G
20190 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
201a0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
201b0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36    sqlite3_open16
201c0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
201d0 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
201e0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
201f0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
20200 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
20210 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
20220 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20230 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
20240 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20250 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
20260 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20270 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20280 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
20290 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e  16 <UTF-16 strin
202a0 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  g>.**.** Return 
202b0 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65  1 if the supplie
202c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
202d0 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
202e0 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a  tement, or zero.
202f0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
20300 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
20310 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
20320 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69  omplete16(.  voi
20330 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20340 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20350 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20360 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20370 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
20380 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20390 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20  _OMIT_COMPLETE) 
203a0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
203b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20  TE_OMIT_UTF16). 
203c0 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
203d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
203e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
203f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
20400 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71  bjv, "<utf-16 sq
20410 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  l>");.    return
20420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
20430 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a  .  zBuf = (char*
20440 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
20450 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
20460 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  , 0);.  Tcl_SetO
20470 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20480 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
20490 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
204a0 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69  6(zBuf)));.#endi
204b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
204c0 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c  _COMPLETE && SQL
204d0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
204e0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
204f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
20500 65 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61  e: sqlite3_norma
20510 6c 69 7a 65 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 52  lize SQL.**.** R
20520 65 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  eturn the normal
20530 69 7a 65 64 20 76 61 6c 75 65 20 66 6f 72 20 61  ized value for a
20540 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
20550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
20560 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
20570 74 5f 6e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 76  t_normalize(.  v
20580 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20590 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
205a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
205b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
205c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
205d0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
205e0 68 61 72 20 2a 7a 4e 6f 72 6d 3b 0a 20 20 65 78  har *zNorm;.  ex
205f0 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74  tern char *sqlit
20600 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63 6f 6e  e3_normalize(con
20610 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66  st char*);..  if
20620 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
20630 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
20640 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
20650 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 72  v, "SQL");.    r
20660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20670 0a 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 28  .  }..  zSql = (
20680 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 53 74 72  char*)Tcl_GetStr
20690 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
206a0 7a 4e 6f 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  zNorm = sqlite3_
206b0 6e 6f 72 6d 61 6c 69 7a 65 28 7a 53 71 6c 29 3b  normalize(zSql);
206c0 0a 20 20 69 66 28 20 7a 4e 6f 72 6d 20 29 7b 0a  .  if( zNorm ){.
206d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
206e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
206f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
20700 6f 72 6d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73  orm, -1));.    s
20710 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 6f 72  qlite3_free(zNor
20720 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  m);.  }.  return
20730 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20740 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20750 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  _step STMT.**.**
20760 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61   Advance the sta
20770 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  tement to the ne
20780 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
20790 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
207a0 41 50 49 20 74 65 73 74 5f 73 74 65 70 28 0a 20  API test_step(. 
207b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
207c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
207d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
207e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
207f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20800 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20810 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
20820 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
20830 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20840 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20850 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20860 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
20870 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20880 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
20890 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
208a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
208b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
208c0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
208d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
208e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
208f0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
20900 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
20910 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
20920 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
20930 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
20940 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
20950 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20960 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
20970 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
20980 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
20990 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
209a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
209b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
209c0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71  E_TCLAPI test_sq
209d0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
209e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
209f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20a00 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20a10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20a20 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
20a30 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
20a40 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
20a50 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
20a60 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
20a70 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
20a80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20a90 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
20aa0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
20ab0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
20ac0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
20ad0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
20ae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
20af0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20b00 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
20b10 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c  _sql(pStmt), TCL
20b20 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65  _VOLATILE);.  re
20b30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73  turn TCL_OK;.}.s
20b40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20b50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 5f  _TCLAPI test_ex_
20b60 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
20b70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
20b80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20b90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20ba0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20bb0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20bc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
20bd0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
20be0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
20bf0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
20c00 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
20c10 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
20c20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c30 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
20c40 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20c50 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20c60 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
20c70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20c80 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  RROR;.  z = sqli
20c90 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c  te3_expanded_sql
20ca0 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
20cb0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20cc0 20 7a 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45   z, TCL_VOLATILE
20cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
20ce0 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
20cf0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 69 66 64 65 66 20  CL_OK;.}.#ifdef 
20d00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
20d10 52 4d 41 4c 49 5a 45 0a 73 74 61 74 69 63 20 69  RMALIZE.static i
20d20 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
20d30 20 74 65 73 74 5f 6e 6f 72 6d 5f 73 71 6c 28 0a   test_norm_sql(.
20d40 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20d50 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20d60 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20d70 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20d80 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20d90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
20da0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
20db0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
20dc0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
20dd0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
20de0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
20df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20e00 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
20e10 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20e20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20e30 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
20e40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20e50 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
20e60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
20e70 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6e 6f  har *)sqlite3_no
20e80 72 6d 61 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74  rmalized_sql(pSt
20e90 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  mt), TCL_VOLATIL
20ea0 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
20eb0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
20ec0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
20ed0 4f 52 4d 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a  ORMALIZE */../*.
20ee0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
20ef0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53  3_column_count S
20f00 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
20f10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
20f20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
20f30 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
20f40 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
20f50 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20f60 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c  _TCLAPI test_col
20f70 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
20f80 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20f90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20fa0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20fb0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20fc0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20fd0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
20fe0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
20ff0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
21000 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21010 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
21020 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
21030 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
21040 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
21050 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
21060 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
21070 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
21080 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
21090 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
210a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
210b0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
210c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
210d0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
210e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
210f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
21100 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
21110 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
21120 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
21130 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
21140 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
21150 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
21160 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
21170 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
21180 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
21190 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
211a0 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
211b0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
211c0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
211d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
211e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
211f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
21200 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
21210 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
21220 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
21230 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
21240 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a   col;.  int tp;.
21250 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
21260 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
21270 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
21280 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
21290 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
212a0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
212b0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
212c0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
212d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
212e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
212f0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
21300 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
21310 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
21320 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
21330 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
21340 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
21350 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
21360 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
21370 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21380 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f  .  tp = sqlite3_
21390 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
213a0 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63  t, col);.  switc
213b0 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73  h( tp ){.    cas
213c0 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
213d0 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  : .      Tcl_Set
213e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
213f0 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54  INTEGER", TCL_ST
21400 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
21410 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
21420 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  LITE_NULL:.     
21430 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21440 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54  nterp, "NULL", T
21450 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
21460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
21470 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
21480 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
21490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c  sult(interp, "FL
214a0 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  OAT", TCL_STATIC
214b0 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
214c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
214d0 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c  _TEXT:.      Tcl
214e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
214f0 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53  p, "TEXT", TCL_S
21500 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
21510 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
21520 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20  QLITE_BLOB:.    
21530 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
21540 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20  interp, "BLOB", 
21550 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
21560 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
21570 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
21580 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
21590 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
215a0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
215b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
215c0 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  t64 STMT column.
215d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
215e0 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
215f0 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
21600 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
21610 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28   as an.** wide (
21620 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e  64-bit) integer.
21630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
21640 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
21650 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a  t_column_int64(.
21660 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
21670 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21680 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21690 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
216a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
216b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
216c0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
216d0 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a  ol;.  i64 iVal;.
216e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
216f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
21700 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
21710 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
21720 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
21730 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
21740 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
21750 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
21760 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
21770 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
21780 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
21790 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
217a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
217b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
217c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
217d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
217e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
217f0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
21800 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21810 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  iVal = sqlite
21820 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
21830 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
21840 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
21850 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
21860 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b  deIntObj(iVal));
21870 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
21890 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
218a0 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d  _blob STMT colum
218b0 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
218c0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
218d0 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a  st_column_blob(.
218e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
218f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21900 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21910 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
21920 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
21930 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
21940 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
21950 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  ol;..  int len;.
21960 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
21970 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  lob;..  if( objc
21980 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
21990 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
219a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
219b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
219c0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
219d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
219e0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
219f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
21a00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21a10 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
21a20 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
21a30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
21a40 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
21a50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21a60 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
21a70 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
21a80 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
21a90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21aa0 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  ROR;..  len = sq
21ab0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
21ac0 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  es(pStmt, col);.
21ad0 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
21ae0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
21af0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
21b00 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21b10 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
21b20 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c  eArrayObj(pBlob,
21b30 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e   len));.  return
21b40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21b50 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
21b60 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53  _column_double S
21b70 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
21b80 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
21b90 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
21ba0 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
21bb0 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61  nt row cast as a
21bc0 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
21bd0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
21be0 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e  LAPI test_column
21bf0 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
21c00 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
21c10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21c20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
21c30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21c40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
21c50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
21c60 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64  ;.  int col;.  d
21c70 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69  ouble rVal;..  i
21c80 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
21c90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
21ca0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
21cb0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
21cc0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
21cd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21ce0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
21cf0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
21d00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21d10 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
21d20 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
21d30 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
21d40 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
21d50 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
21d60 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
21d70 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
21d80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
21d90 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
21da0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
21db0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
21dc0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
21dd0 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
21de0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21df0 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  rp, Tcl_NewDoubl
21e00 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72  eObj(rVal));.  r
21e10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
21e20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
21e30 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
21e40 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
21e50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
21e60 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
21e70 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
21e80 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
21e90 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
21ea0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
21eb0 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
21ec0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
21ed0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21ee0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
21ef0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
21f00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
21f10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
21f20 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
21f30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
21f40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21f50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
21f60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
21f70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
21f80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
21f90 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
21fa0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
21fb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
21fc0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
21fd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
21fe0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21ff0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
22000 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22010 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
22020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
22030 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
22040 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
22050 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
22060 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
22070 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
22080 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
22090 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
220a0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
220b0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
220c0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
220d0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
220e0 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
220f0 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
22100 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
22110 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  PI test_stmt_utf
22120 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  8(.  void * clie
22130 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f  ntData,        /
22140 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
22150 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
22160 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f   to be invoke */
22170 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22180 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
22190 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
221a0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
221b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
221c0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
221d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a    const char *(*
221e0 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
221f0 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f  tmt*, int);.  co
22200 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  nst char *zRet;.
22210 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73  .  xFunc = (cons
22220 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69  t char *(*)(sqli
22230 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
22240 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
22250 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
22260 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22270 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
22280 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
22290 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
222a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
222b0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
222c0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
222d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
222e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
222f0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
22300 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22310 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
22320 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
22330 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
22340 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
22350 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
22360 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
22370 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65  TCL_ERROR;.  zRe
22380 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c  t = xFunc(pStmt,
22390 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65   col);.  if( zRe
223a0 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  t ){.    Tcl_Set
223b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
223c0 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b  char *)zRet, 0);
223d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
223e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
223f0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
22400 49 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65  I test_global_re
22410 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
22420 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
22430 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22440 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
22450 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
22460 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
22470 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
22480 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63  RECATED.  int rc
22490 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
224a0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
224b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
224c0 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
224d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
224e0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
224f0 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
22500 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53  cover();.  Tcl_S
22510 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
22520 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
22530 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
22540 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ATIC);.#endif.  
22550 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22560 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
22570 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
22580 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
22590 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
225a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
225b0 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
225c0 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
225d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
225e0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
225f0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
22600 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74  E_TCLAPI test_st
22610 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
22620 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
22630 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22640 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
22650 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
22660 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
22670 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
22680 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
22690 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
226a0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
226b0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
226c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
226d0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
226e0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
226f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
22700 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
22710 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
22720 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
22730 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  );..  xFunc = (c
22740 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73  onst void *(*)(s
22750 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
22760 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
22770 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
22780 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
22790 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
227a0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
227b0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
227c0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
227d0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
227e0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
227f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22800 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
22810 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
22820 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22830 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22840 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
22850 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
22860 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
22870 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
22880 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
22890 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
228a0 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63   zName16 = xFunc
228b0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
228c0 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20  if( zName16 ){. 
228d0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f     int n;.    co
228e0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e  nst char *z = zN
228f0 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e  ame16;.    for(n
22900 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b  =0; z[n] || z[n+
22910 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20  1]; n+=2){}.    
22920 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pRet = Tcl_NewBy
22930 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65  teArrayObj(zName
22940 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63  16, n+2);.    Tc
22950 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
22960 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
22970 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22980 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
22990 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
229a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
229b0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
229c0 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d  n_int STMT colum
229d0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
229e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
229f0 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  tes STMT column.
22a00 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
22a10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
22a20 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  s16 STMT column.
22a30 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
22a40 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
22a50 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20  est_stmt_int(.  
22a60 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
22a70 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  a,    /* Pointer
22a80 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
22a90 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
22aa0 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  voked */.  Tcl_I
22ab0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
22ac0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
22ad0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22ae0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
22af0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
22b00 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a  nt col;.  int (*
22b10 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
22b20 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78  tmt*, int);..  x
22b30 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28  Func = (int (*)(
22b40 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
22b50 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
22b60 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
22b70 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22b80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22b90 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22ba0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
22bb0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
22bc0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
22bd0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
22be0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22bf0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
22c00 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
22c10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
22c20 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
22c30 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
22c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
22c50 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
22c60 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
22c70 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
22c80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
22c90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22ca0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22cb0 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
22cc0 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
22cd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22ce0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
22cf0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
22d00 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42    DB  MAGIC-NUMB
22d10 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  ER.**.** Set the
22d20 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65   db->magic value
22d30 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
22d40 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65  to test error re
22d50 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f  covery logic..*/
22d60 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
22d70 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
22d80 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f  _set_magic(.  vo
22d90 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22da0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22db0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22dc0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22dd0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22de0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
22df0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
22e00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22e10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
22e20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
22e30 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[0],.        
22e40 20 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29   " DB MAGIC", 0)
22e50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22e60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22e70 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22e80 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
22e90 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
22ea0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
22eb0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
22ec0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
22ed0 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  N")==0 ){.    db
22ee0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
22ef0 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d  _MAGIC_OPEN;.  }
22f00 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
22f10 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
22f20 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d  _MAGIC_CLOSED")=
22f30 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
22f40 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
22f50 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c  IC_CLOSED;.  }el
22f60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
22f70 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
22f80 41 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29  AGIC_BUSY")==0 )
22f90 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
22fa0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
22fb0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  USY;.  }else if(
22fc0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
22fd0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45   "SQLITE_MAGIC_E
22fe0 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20  RROR")==0 ){.   
22ff0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
23000 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
23010 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c  .  }else if( Tcl
23020 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
23030 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26  argv[2], (int*)&
23040 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20  db->magic) ){.  
23050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23060 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
23070 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
23080 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
23090 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42 20  3_interrupt  DB 
230a0 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61  .**.** Trigger a
230b0 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44  n interrupt on D
230c0 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
230d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
230e0 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20  st_interrupt(.  
230f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
23100 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
23110 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
23120 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
23130 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
23140 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
23150 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
23160 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23170 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
23180 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
23190 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c   argv[0], " DB",
231a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
231b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
231c0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
231d0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
231e0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
231f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
23200 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
23210 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  db);.  return TC
23220 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
23230 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
23240 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20  ete_function DB 
23250 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a  function-name.**
23260 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75  .** Delete the u
23270 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75  ser function 'fu
23280 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  nction-name' fro
23290 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
232a0 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61  e DB. It.** is a
232b0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
232c0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61  user function wa
232d0 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
232e0 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66  8, any number of
232f0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74  .** arguments (t
23300 68 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  he way the TCL i
23310 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
23320 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23330 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
23340 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  elete_function(.
23350 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
23360 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
23370 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
23380 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
23390 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
233a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
233b0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
233c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
233d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
233e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
233f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
23400 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
23410 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
23420 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
23430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23440 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23450 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
23460 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
23470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
23490 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
234a0 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
234b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
234c0 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
234d0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
234e0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
234f0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
23500 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
23510 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23520 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64   Usage: sqlite_d
23530 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
23540 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d  DB collation-nam
23550 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
23560 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
23570 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  uence 'collation
23580 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61  -name' from data
23590 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
235a0 44 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  DB. It is assume
235b0 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61  d that the colla
235c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61  tion sequence wa
235d0 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
235e0 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74  8 (the .** way t
235f0 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
23600 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
23610 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
23620 54 43 4c 41 50 49 20 64 65 6c 65 74 65 5f 63 6f  TCLAPI delete_co
23630 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  llation(.  void 
23640 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
23650 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23660 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
23670 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
23680 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
23690 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
236a0 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
236b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
236c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
236d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
236e0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
236f0 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
23700 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
23710 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23720 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23730 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23740 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
23750 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
23760 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
23770 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
23780 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  llation(db, argv
23790 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  [2], SQLITE_UTF8
237a0 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
237b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
237c0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
237d0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
237e0 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
237f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23800 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
23810 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44  get_autocommit D
23820 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
23830 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
23840 61 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e  ase DB is curren
23850 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d  tly in auto-comm
23860 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75  it mode..** Retu
23870 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  rn false if not.
23880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
23890 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 67 65 74  QLITE_TCLAPI get
238a0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76  _autocommit(.  v
238b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
238c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
238d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
238e0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
238f0 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66  v.){.  char zBuf
23900 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  [30];.  sqlite3 
23910 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
23920 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
23930 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23940 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
23950 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
23960 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
23970 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
23980 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23990 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
239a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
239b0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
239c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
239d0 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ROR;.  sqlite3_s
239e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
239f0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
23a00 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  , sqlite3_get_au
23a10 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20  tocommit(db));. 
23a20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
23a30 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
23a40 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23a50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23a60 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73  age: sqlite3_bus
23a70 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a  y_timeout DB MS.
23a80 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  **.** Set the bu
23a90 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69  sy timeout.  Thi
23aa0 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79  s is more easily
23ab0 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20   done using the 
23ac0 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f  timeout.** metho
23ad0 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74  d of the TCL int
23ae0 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20  erface.  But we 
23af0 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65  need a way to te
23b00 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  st the case.** w
23b10 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20  here it returns 
23b20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a  SQLITE_MISUSE..*
23b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
23b40 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
23b50 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20  busy_timeout(.  
23b60 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
23b70 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
23b80 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
23b90 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
23ba0 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  gv.){.  int rc, 
23bb0 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms;.  sqlite3 *d
23bc0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
23bd0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
23be0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
23bf0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
23c00 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
23c10 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
23c20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
23c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
23c50 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23c60 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
23c70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23c80 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
23c90 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
23ca0 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
23cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73  rc = sqlite3_bus
23cd0 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73  y_timeout(db, ms
23ce0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
23cf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
23d00 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
23d10 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
23d20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23d30 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69  Usage:  tcl_vari
23d40 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42  able_type VARIAB
23d50 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74  LENAME.**.** Ret
23d60 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
23d70 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
23d80 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  resentation for 
23d90 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
23da0 74 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62  the given variab
23db0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
23dc0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
23dd0 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
23de0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
23df0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
23e00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
23e10 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
23e20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
23e30 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ].){.  Tcl_Obj *
23e40 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63  pVar;.  if( objc
23e50 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
23e60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
23e70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41  rp, 1, objv, "VA
23e80 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65  RIABLE");.    re
23e90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23ea0 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c    }.  pVar = Tcl
23eb0 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
23ec0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
23ed0 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43  (objv[1]), 0, TC
23ee0 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29  L_LEAVE_ERR_MSG)
23ef0 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20  ;.  if( pVar==0 
23f00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
23f10 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e  OR;.  if( pVar->
23f20 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54  typePtr ){.    T
23f30 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23f40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
23f50 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74  tringObj(pVar->t
23f60 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31  ypePtr->name, -1
23f70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
23f80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
23f90 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
23fa0 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
23fb0 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d   ?N?.**.** Attem
23fc0 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  pt to release me
23fd0 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68  mory currently h
23fe0 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75  eld but not actu
23ff0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a  ally required..*
24000 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20  * The integer N 
24010 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24020 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72   bytes we are tr
24030 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e  ying to release.
24040 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e    The .** return
24050 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d   value is the am
24060 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ount of memory a
24070 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64  ctually released
24080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24090 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
240a0 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
240b0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
240c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
240d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
240e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
240f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24100 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ].){.#if defined
24110 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
24120 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
24130 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
24140 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
24150 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74  ).  int N;.  int
24160 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63   amt;.  if( objc
24170 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=1 && objc!=2 )
24180 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
24190 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
241a0 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a  , objv, "?N?");.
241b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
241c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
241d0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
241e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
241f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24200 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
24210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24220 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d  }else{.    N = -
24230 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  1;.  }.  amt = s
24240 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
24250 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f  emory(N);.  Tcl_
24260 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
24270 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
24280 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66  bj(amt));.#endif
24290 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
242a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
242b0 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  e:  sqlite3_db_r
242c0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42  elease_memory DB
242d0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
242e0 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
242f0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
24300 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  by database DB. 
24310 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72   Return the.** r
24320 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63  esult code (whic
24330 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  h in the current
24340 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24350 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e  is always zero).
24360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24370 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24380 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  t_db_release_mem
24390 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ory(.  void * cl
243a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
243b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
243c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
243d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
243e0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
243f0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
24400 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
24410 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
24420 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
24430 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
24440 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24450 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24460 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24470 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
24480 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
24490 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
244a0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
244b0 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
244c0 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f  mory(db);.  Tcl_
244d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
244e0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
244f0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
24500 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
24510 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
24520 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  e3_db_cacheflush
24530 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70   DB.**.** Attemp
24540 74 20 74 6f 20 66 6c 75 73 68 20 61 6e 79 20 64  t to flush any d
24550 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
24560 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
24570 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
24580 74 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75  test_db_cacheflu
24590 73 68 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sh(.  void * cli
245a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
245b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
245c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
245d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
245e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
245f0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
24600 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
24610 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
24620 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
24630 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
24640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24650 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
24660 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
24670 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
24680 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
24690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
246a0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
246b0 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28  3_db_cacheflush(
246c0 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  db);.  if( rc ){
246d0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
246e0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
246f0 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
24700 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
24710 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24720 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
24730 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
24740 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
24750 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
24760 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
24770 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20  e3_system_errno 
24780 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
24790 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79  the low-level sy
247a0 73 74 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65  stem errno value
247b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
247c0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
247d0 73 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  st_system_errno(
247e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
247f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
24800 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
24810 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
24820 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
24830 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24840 3b 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a  ;.  int iErrno;.
24850 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
24860 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
24870 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
24880 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
24890 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
248a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
248b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
248c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
248d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
248e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
248f0 4f 52 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73  OR;.  iErrno = s
24900 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72  qlite3_system_er
24910 72 6e 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  rno(db);.  Tcl_S
24920 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
24930 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
24940 6a 28 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65  j(iErrno));.  re
24950 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
24960 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
24970 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
24980 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a  e DB DBNAME.**.*
24990 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
249a0 65 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f  e of a file asso
249b0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
249c0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
249d0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
249e0 41 50 49 20 74 65 73 74 5f 64 62 5f 66 69 6c 65  API test_db_file
249f0 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  name(.  void * c
24a00 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
24a10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24a20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
24a30 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24a40 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
24a50 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
24a60 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
24a70 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
24a80 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
24a90 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
24aa0 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22  bjv, "DB DBNAME"
24ab0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24ac0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24ad0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24ae0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24af0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24b00 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
24b10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61  L_ERROR;.  zDbNa
24b20 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
24b30 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54  ng(objv[2]);.  T
24b40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24b50 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
24b60 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20  db_filename(db, 
24b70 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a  zDbName), (void*
24b80 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
24b90 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
24ba0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
24bb0 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42  b_readonly DB DB
24bc0 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
24bd0 6e 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41  n 1 or 0 if DBNA
24be0 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f  ME is readonly o
24bf0 72 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d  r not.  Return -
24c00 31 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73  1 if DBNAME does
24c10 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  .** not exist..*
24c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
24c30 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
24c40 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76  db_readonly(.  v
24c50 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
24c60 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
24c70 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
24c80 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
24c90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
24ca0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24cb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
24cc0 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ame;.  if( objc!
24cd0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
24ce0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
24cf0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
24d00 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
24d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24d20 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24d30 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24d40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24d50 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
24d60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24d70 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f    zDbName = Tcl_
24d80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
24d90 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ]);.  Tcl_SetObj
24da0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
24db0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
24dc0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
24dd0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b  (db, zDbName)));
24de0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
24e00 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  :  sqlite3_soft_
24e10 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a  heap_limit ?N?.*
24e20 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65  *.** Query or se
24e30 74 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20  t the soft heap 
24e40 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75  limit for the cu
24e50 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54  rrent thread.  T
24e60 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f  he.** limit is o
24e70 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
24e80 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e  he N is present.
24e90 20 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c    The previous l
24ea0 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72  imit.** is retur
24eb0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
24ec0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
24ed0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
24ee0 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
24ef0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
24f00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24f10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
24f20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
24f30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
24f40 65 33 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20  e3_int64 amt;.  
24f50 54 63 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20  Tcl_WideInt N = 
24f60 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  -1;.  if( objc!=
24f70 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
24f80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
24f90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
24fa0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
24fb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24fc0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
24fd0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
24fe0 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
24ff0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
25000 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
25010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25020 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69    }.  amt = sqli
25030 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
25040 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f  mit64(N);.  Tcl_
25050 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
25060 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
25070 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20  IntObj(amt));.  
25080 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25090 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
250a0 73 71 6c 69 74 65 33 5f 68 61 72 64 5f 68 65 61  sqlite3_hard_hea
250b0 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a  p_limit ?N?.**.*
250c0 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
250d0 68 65 20 68 61 72 64 20 68 65 61 70 20 6c 69 6d  he hard heap lim
250e0 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
250f0 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a  nt thread.  The.
25100 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79  ** limit is only
25110 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
25120 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54  N is present.  T
25130 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69  he previous limi
25140 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  t.** is returned
25150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25160 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
25170 73 74 5f 68 61 72 64 5f 68 65 61 70 5f 6c 69 6d  st_hard_heap_lim
25180 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  it(.  void * cli
25190 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
251a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
251b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
251c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
251d0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
251e0 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c  int64 amt;.  Tcl
251f0 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b  _WideInt N = -1;
25200 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26  .  if( objc!=1 &
25210 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
25220 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
25230 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
25240 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72  v, "?N?");.    r
25250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25260 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
25270 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
25280 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
25290 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
252a0 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
252b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
252c0 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33  .  amt = sqlite3
252d0 5f 68 61 72 64 5f 68 65 61 70 5f 6c 69 6d 69 74  _hard_heap_limit
252e0 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  64(N);.  Tcl_Set
252f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25300 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
25310 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74  Obj(amt));.  ret
25320 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
25330 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
25340 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
25350 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  anup.**.** Call 
25360 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65  the sqlite3_thre
25370 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a  ad_cleanup API..
25380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25390 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
253a0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
253b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
253c0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
253d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
253e0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
253f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
25400 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
25410 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
25420 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  D.  sqlite3_thre
25430 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65  ad_cleanup();.#e
25440 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
25450 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
25460 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
25470 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
25480 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
25490 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65   a list of numbe
254a0 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  rs which are the
254b0 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66   PagerRefcount f
254c0 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73  or all.** pagers
254d0 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
254e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
254f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
25500 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
25510 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
25520 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
25530 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
25540 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
25550 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
25560 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
25570 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
25580 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
25590 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
255a0 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
255b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
255c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
255d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
255e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
255f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25600 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
25610 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
25620 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
25630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25640 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
25650 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
25660 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
25670 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
25680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25690 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
256a0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
256b0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
256c0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
256d0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
256e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
256f0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
25700 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
25710 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
25720 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
25730 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
25740 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
25750 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
25760 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
25770 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
25780 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
25790 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
257a0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
257b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
257c0 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
257d0 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
257e0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
257f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
25800 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
25810 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
25820 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
25830 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
25840 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
25850 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
25860 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
25870 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
25880 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
25890 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
258a0 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
258b0 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
258c0 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
258d0 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
258e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
258f0 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
25900 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
25910 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
25920 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
25930 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
25940 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
25950 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
25960 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
25970 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
25980 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
25990 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
259a0 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
259b0 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
259c0 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
259d0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
259e0 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
259f0 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
25a00 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
25a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25a20 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f 72 6b  LITE_TCLAPI work
25a30 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20  ing_64bit_int(. 
25a40 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25a50 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25a60 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25a70 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25a80 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25a90 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25aa0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25ab0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25ac0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25ad0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25af0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25b00 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25b10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25b20 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25b30 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  ts */.){.  Tcl_O
25b40 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20  bj *pTestObj;.  
25b50 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b  int working = 0;
25b60 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54  ..  pTestObj = T
25b70 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
25b80 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32  (1000000*(i64)12
25b90 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72  34567890);.  wor
25ba0 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63  king = strcmp(Tc
25bb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73  l_GetString(pTes
25bc0 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38  tObj), "12345678
25bd0 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20  90000000")==0;. 
25be0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
25bf0 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54  t(pTestObj);.  T
25c00 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
25c10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
25c20 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e  ooleanObj(workin
25c30 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  g));.  return TC
25c40 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
25c50 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
25c60 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  link_test.**.** 
25c70 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
25c80 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65   unregisters the
25c90 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64   primary VFS and
25ca0 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a   then registers.
25cb0 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ** it back again
25cc0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
25cd0 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c  to test the abil
25ce0 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20  ity to register 
25cf0 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f  a.** VFS when no
25d00 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c  ne are previousl
25d10 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e  y registered, an
25d20 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  d the ability to
25d30 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20   .** unregister 
25d40 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  the only availab
25d50 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20  le VFS.  Ticket 
25d60 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20  #2738.*/.static 
25d70 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
25d80 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73  I vfs_unlink_tes
25d90 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
25da0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25db0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25dc0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25dd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25de0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25df0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25e00 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25e10 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25e20 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25e40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25e50 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25e60 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25e70 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25e80 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
25e90 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
25ea0 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71  vfs *pMain;.  sq
25eb0 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
25ec0 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [20];.  sqlite3_
25ed0 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20  vfs one, two;.. 
25ee0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
25ef0 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a  egister(0);   /*
25f00 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e   Unregister of N
25f10 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ULL is harmless 
25f20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  */.  one.zName =
25f30 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e   "__one";.  two.
25f40 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b  zName = "__two";
25f50 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
25f60 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
25f70 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67  ter with 2nd arg
25f80 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20  ument of 0 does 
25f90 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  not.  ** change 
25fa0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a  the default VFS.
25fb0 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73    */.  pMain = s
25fc0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
25fd0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0);.  sqlite3_vf
25fe0 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
25ff0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
26000 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
26010 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26020 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  nd(0) );.  sqlit
26030 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
26040 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  &two, 0);.  asse
26050 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
26060 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
26070 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
26080 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20   /* We can find 
26090 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d  a VFS by its nam
260a0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
260b0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
260c0 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
260d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
260e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
260f0 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a  two")==&two );..
26100 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
26110 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72  ite_vfs_register
26120 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
26130 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
26140 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a  changes the.  **
26150 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76   default VFS, ev
26160 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61  en if the 1st pa
26170 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78  rameter is an ex
26180 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69  istig VFS that i
26190 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  s.  ** previousl
261a0 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
261b0 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e  the non-default.
261c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
261d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
261e0 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 1);.  assert(
261f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
26200 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
26210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26220 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
26230 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
26240 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26250 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
26260 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65  &one );.  sqlite
26270 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
26280 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  two, 1);.  asser
26290 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
262a0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
262b0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
262c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
262d0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
262e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
262f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
26300 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20  ==&two );.  if( 
26310 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  pMain ){.    sql
26320 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
26330 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20  r(pMain, 1);.   
26340 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26350 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
26360 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20  ")==&one );.    
26370 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26380 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
26390 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61  )==&two );.    a
263a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
263b0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
263c0 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n );.  }.  .  /*
263d0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61   Unlink the defa
263e0 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74  ult VFS.  Repeat
263f0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65   until there are
26400 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20   no more VFSes. 
26410 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a   ** registered..
26420 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
26430 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i<sizeof(apVfs)/
26440 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
26450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
26460 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
26470 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
26480 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
26490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
264a0 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
264b0 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
264c0 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
264d0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
264e0 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
264f0 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i]);.      asser
26500 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
26510 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
26520 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
26530 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
26540 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26550 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  nd(0) );.  .  /*
26560 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61   Register the ma
26570 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65  in VFS as non-de
26580 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d  fault (will be m
26590 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e  ade default, sin
265a0 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65  ce.  ** it'll be
265b0 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e   the only one in
265c0 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a   existence)..  *
265d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
265e0 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
265f0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  0);.  assert( sq
26600 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
26610 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  )==pMain );.  . 
26620 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20   /* Un-register 
26630 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61  the main VFS aga
26640 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e  in to restore an
26650 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20   empty VFS list 
26660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
26670 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69  _unregister(pMai
26680 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  n);.  assert( 0=
26690 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
266a0 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  d(0) );..  /* Re
266b0 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69  link all VFSes i
266c0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
266d0 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69   */  .  for(i=si
266e0 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
266f0 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20  of(apVfs[0])-1; 
26700 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
26710 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
26720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
26730 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
26740 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  [i], 1);.      a
26750 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
26760 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
26770 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73  d(0) );.      as
26780 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
26790 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
267a0 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
267b0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ) );.    }.  }..
267c0 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
267d0 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73  out sample VFSes
267e0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  . */.  sqlite3_v
267f0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
26800 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
26810 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
26820 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  wo);..  /* Unreg
26830 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74  istering a VFS t
26840 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65  hat is not curre
26850 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
26860 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
26870 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
26880 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
26890 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
268a0 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20  egister(&two);. 
268b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
268c0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
268d0 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ")==0 );.  asser
268e0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
268f0 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20  ind("__two")==0 
26900 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
26910 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20  ld be left with 
26920 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66  the original def
26930 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73  ault VFS back as
26940 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
26950 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
26960 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26970 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20  (0)==pMain );.. 
26980 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
26990 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
269a0 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
269b0 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
269c0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65  TCL command atte
269d0 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64  mpts to vfs_find
269e0 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65   and vfs_registe
269f0 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  r when the.** sq
26a00 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
26a10 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  () interface is 
26a20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61  failing.  All ca
26a30 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e  lls should fail.
26a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
26a50 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73  QLITE_TCLAPI vfs
26a60 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28 0a  _initfail_test(.
26a70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26a80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26a90 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26aa0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
26ab0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
26ac0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26ad0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26ae0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26af0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26b00 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26b20 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26b30 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26b40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26b50 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26b60 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
26b70 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f  te3_vfs one;.  o
26b80 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e  ne.zName = "__on
26b90 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  e";..  if( sqlit
26ba0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
26bb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26bc0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
26bd0 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
26be0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
26bf0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
26c00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26c10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
26c20 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31  register(&one, 1
26c30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
26c40 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72  _vfs_find(0) ) r
26c50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26c60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64  ;.}../*.** Saved
26c80 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63   VFSes.*/.static
26c90 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70   sqlite3_vfs *ap
26ca0 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20  Vfs[20];.static 
26cb0 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f  int nVfs = 0;../
26cc0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
26cd0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
26ce0 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74  l.**.** Unregist
26cf0 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f  er all VFSes..*/
26d00 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
26d10 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 75 6e  TE_TCLAPI vfs_un
26d20 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20  register_all(.  
26d30 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26d40 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
26d50 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
26d60 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
26d70 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
26d80 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
26d90 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
26da0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
26db0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
26dc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
26dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26de0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26df0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
26e00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
26e10 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
26e20 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
26e30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
26e40 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20  raySize(apVfs); 
26e50 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b  i++){.    apVfs[
26e60 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  i] = sqlite3_vfs
26e70 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66  _find(0);.    if
26e80 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20  ( apVfs[i]==0 ) 
26e90 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
26ea0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
26eb0 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d  r(apVfs[i]);.  }
26ec0 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72  .  nVfs = i;.  r
26ed0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26ee0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
26ef0 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61  vfs_reregister_a
26f00 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  ll.**.** Restore
26f10 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20   all VFSes that 
26f20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69  were removed usi
26f30 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  ng vfs_unregiste
26f40 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a 2a 2a  r_all. Taking.**
26f50 20 63 61 72 65 20 74 6f 20 70 75 74 20 74 68 65   care to put the
26f60 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 61 63   linked list bac
26f70 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20 74 68  k together in th
26f80 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
26f90 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62 65 66  it was.** in bef
26fa0 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ore vfs_unregist
26fb0 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76 6f 6b  er_all was invok
26fc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26fd0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
26fe0 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61  vfs_reregister_a
26ff0 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
27000 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27010 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
27020 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
27030 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
27040 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27050 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27060 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27070 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27080 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27090 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
270a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
270b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
270c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
270d0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
270e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
270f0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 6e  int i;.  for(i=n
27100 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Vfs-1; i>=0; i--
27110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
27120 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
27130 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  s[i], 1);.  }.  
27140 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
27150 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
27160 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
27170 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68  test DB.**.** Th
27180 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
27190 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
271a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
271b0 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
271c0 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
271d0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
271e0 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  same..*/.static 
271f0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
27200 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  I file_control_t
27210 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
27220 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
27230 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
27240 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
27250 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
27260 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27270 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
27280 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
27290 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
272a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
272b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
272c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
272d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
272e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
272f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
27300 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
27310 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
27320 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
27330 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
27340 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
27350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
27360 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
27370 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
27380 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
27390 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
273a0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
273b0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
273c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
273d0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
273e0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
273f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27400 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
27410 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
27430 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
27440 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20  0, 0, &iArg);.  
27450 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
27460 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20  TE_NOTFOUND );. 
27470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
27480 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
27490 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53  notadatabase", S
274a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
274b0 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20  STATE, &iArg);. 
274c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
274d0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
274e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
274f0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
27500 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  in", -1, &iArg);
27510 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
27520 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
27530 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27540 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
27550 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69  , "temp", -1, &i
27560 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
27570 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
27580 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  UND || rc==SQLIT
27590 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65  E_ERROR );..  re
275a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
275b0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
275c0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
275d0 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a  sterrno_test DB.
275e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
275f0 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
27600 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
27610 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
27620 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
27630 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
27640 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c   of the SQLITE_L
27650 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a  AST_ERRNO verb..
27660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
27670 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
27680 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
27690 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
276a0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
276b0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
276c0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
276d0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
276e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
276f0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
27700 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
27710 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
27720 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
27730 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
27740 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27750 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
27760 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27770 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27780 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27790 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
277a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
277b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
277c0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
277d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
277e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
277f0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
27800 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
27810 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
27820 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
27830 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
27840 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27850 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
27860 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
27870 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
27880 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
27890 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
278a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
278b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
278c0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
278d0 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
278e0 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
278f0 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
27900 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
27910 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
27920 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
27930 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27940 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
27950 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
27960 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
27970 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
27980 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
27990 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
279a0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
279b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
279c0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
279d0 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
279e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
279f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
27a00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
27a10 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27a20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 64    file_control_d
27a30 61 74 61 5f 76 65 72 73 69 6f 6e 20 44 42 20 44  ata_version DB D
27a40 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BNAME.**.** This
27a50 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
27a60 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
27a70 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 69 74 68 20  le_control with 
27a80 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43  the.** SQLITE_FC
27a90 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
27aa0 20 6f 70 63 6f 64 65 2c 20 72 65 74 75 72 6e 69   opcode, returni
27ab0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ng the result..*
27ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
27ad0 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
27ae0 63 6f 6e 74 72 6f 6c 5f 64 61 74 61 5f 76 65 72  control_data_ver
27af0 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61  sion(.  ClientDa
27b00 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27b10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27b20 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27b30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27b40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27b50 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27b60 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27b70 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27b80 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27b90 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27ba0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27bb0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27bc0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27bd0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27be0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27bf0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
27c00 56 65 72 73 3b 20 20 20 20 20 20 20 20 20 20 20  Vers;           
27c10 20 20 2f 2a 20 64 61 74 61 20 76 65 72 73 69 6f    /* data versio
27c20 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  n */.  char *zDb
27c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c40 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
27c50 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
27c60 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
27c70 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c90 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
27ca0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
27cd0 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
27ce0 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75  de */.  char zBu
27cf0 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
27d00 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
27d10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
27d20 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
27d30 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 5b  , 1, objv, "DB [
27d40 44 42 4e 41 4d 45 5d 22 29 3b 0a 20 20 20 20 72  DBNAME]");.    r
27d50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27d60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
27d70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
27d80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27d90 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
27da0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27db0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
27dc0 20 6f 62 6a 63 3d 3d 33 20 3f 20 54 63 6c 5f 47   objc==3 ? Tcl_G
27dd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
27de0 29 20 3a 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  ) : NULL;..  rc 
27df0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
27e00 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
27e10 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
27e20 41 5f 56 45 52 53 49 4f 4e 2c 20 28 76 6f 69 64  A_VERSION, (void
27e30 20 2a 29 26 69 56 65 72 73 29 3b 0a 20 20 69 66   *)&iVers);.  if
27e40 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
27e50 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
27e60 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
27e70 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
27e80 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
27e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
27eb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
27ec0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
27ed0 2c 22 25 75 22 2c 69 56 65 72 73 29 3b 0a 20 20  ,"%u",iVers);.  
27ee0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
27ef0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
27f00 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  zBuf, TCL_VOLATI
27f10 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
27f20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TCL_OK;.  }.}../
27f30 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
27f40 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
27f50 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42  ksize_test DB DB
27f60 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20  NAME SIZE.**.** 
27f70 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
27f80 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
27f90 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
27fa0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
27fb0 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
27fc0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
27fd0 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
27fe0 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
27ff0 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
28000 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
28010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28020 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
28030 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
28040 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c 69  size_test(.  Cli
28050 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
28060 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
28070 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
28080 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
28090 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
280a0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
280b0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
280c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
280d0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
280e0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
280f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28100 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
28110 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28120 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
28130 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
28140 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  /.){.  int nSize
28150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28160 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 68         /* New ch
28170 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68  unk size */.  ch
28180 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
281a0 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22   Db name ("main"
281b0 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a  , "temp" etc.) *
281c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
281f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
28200 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
28210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
28220 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65  ile_control() re
28230 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
28240 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
28250 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28260 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28270 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20  bjv, "DB DBNAME 
28280 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75  SIZE");.    retu
28290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
282a0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
282b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
282c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
282d0 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c  1]), &db) .   ||
282e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
282f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28300 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b  3], &nSize).  ){
28310 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
28320 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
28330 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
28340 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
28350 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a  zDb[0]=='\0' ) z
28360 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63  Db = NULL;..  rc
28370 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
28380 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
28390 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
283a0 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64 20  UNK_SIZE, (void 
283b0 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28  *)&nSize);.  if(
283c0 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
283d0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
283e0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
283f0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  ErrName(rc), TCL
28400 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
28410 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
28430 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
28440 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
28450 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
28460 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
28470 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
28480 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
28490 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
284a0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
284b0 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45   .** with SQLITE
284c0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
284d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
284e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
284f0 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
28500 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nt_test(.  Clien
28510 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28520 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28530 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28540 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28550 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28560 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28570 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28580 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28590 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
285a0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
285b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
285c0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
285d0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
285e0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
285f0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28600 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  ){.  Tcl_WideInt
28610 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
28620 20 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73       /* Hinted s
28630 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ize */.  char *z
28640 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
28650 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e           /* Db n
28660 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ame ("main", "te
28670 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73  mp" etc.) */.  s
28680 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286a0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
286b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63         /* file_c
286e0 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20  ontrol() return 
286f0 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  code */..  if( o
28700 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
28710 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28720 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28730 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22  "DB DBNAME SIZE"
28740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28750 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28760 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
28770 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
28780 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28790 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
287a0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
287b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
287c0 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a  ], &nSize).  ){.
287d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
287e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
287f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28800 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  bjv[2]);.  if( z
28810 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44  Db[0]=='\0' ) zD
28820 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  b = NULL;..  rc 
28830 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
28840 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
28850 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
28860 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29  E_HINT, (void *)
28870 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  &nSize);.  if( r
28880 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  c ){.    Tcl_Set
28890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
288a0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
288b0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
288c0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
288d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
288e0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
288f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
28900 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
28910 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
28920 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54  t DB PWD.**.** T
28930 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
28940 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
28950 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
28960 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
28970 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
28980 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
28990 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
289a0 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
289b0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
289c0 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
289d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
289e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
289f0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
28a00 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
28a10 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28a20 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28a30 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28a40 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28a50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28a60 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28a70 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28a80 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28a90 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28aa0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28ab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28ac0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28ad0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28ae0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28af0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28b00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
28b10 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  b;.  .  if( objc
28b20 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28b30 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28b40 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28b50 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28b70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
28b80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
28b90 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57  [0], 0), " DB PW
28ba0 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  D", 0);.    retu
28bb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28bc0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
28bd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
28be0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28bf0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
28c00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28c10 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65  ;.  }.  .#if !de
28c20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
28c30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28c40 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  E).#  if defined
28c50 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20  (__APPLE__).#   
28c60 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
28c70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28c80 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  YLE 1.#  else.# 
28c90 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
28ca0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28cb0 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66  STYLE 0.#  endif
28cc0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
28cd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
28ce0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
28cf0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
28d00 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74  {.    char *test
28d10 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63  Path;.    int rc
28d20 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a  ;.    int nPwd;.
28d30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28d40 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70  zPwd;.    char p
28d50 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20  roxyPath[400];. 
28d60 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54     .    zPwd = T
28d70 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
28d80 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50  Obj(objv[2], &nP
28d90 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  wd);.    if( siz
28da0 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e  eof(proxyPath)<n
28db0 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20  Pwd+20 ){.      
28dc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28dd0 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f  (interp, "PWD to
28de0 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30  o big", (void*)0
28df0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28e00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
28e10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28e20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f  rintf(sizeof(pro
28e30 78 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61  xyPath), proxyPa
28e40 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
28e50 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
28e60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
28e70 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
28e80 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
28e90 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
28ea0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
28eb0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
28ec0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
28ed0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
28ee0 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
28ef0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28f00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
28f10 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
28f20 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
28f30 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
28f40 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
28f50 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
28f60 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
28f70 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
28f80 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
28f90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28fa0 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
28fb0 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
28fc0 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
28ff0 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
29000 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
29010 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29020 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
29030 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
29040 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
29050 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
29060 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
29070 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29080 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
29090 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
290a0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
290b0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
290c0 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
290d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
290e0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
290f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
29100 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
29110 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
29120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
29130 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
29140 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
29150 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29160 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
29170 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
29180 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
29190 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
291a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
291b0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
291c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
291d0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
291e0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
291f0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
29200 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
29210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
29220 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
29230 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
29240 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e  v_retry(.  Clien
29250 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
29260 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
29270 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
29280 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
29290 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
292a0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
292b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
292c0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
292d0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
292e0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
292f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29300 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
29310 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29320 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
29330 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
29340 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
29350 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
29360 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a  t a[2];.  char z
29370 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
29380 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
29390 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
293a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
293b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
293c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
293d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
293e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
293f0 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22  DB NRETRY DELAY"
29400 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
29410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29420 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
29430 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
29440 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
29450 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
29460 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29470 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
29480 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29490 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61  erp, objv[2], &a
294a0 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [0]) ) return TC
294b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
294c0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
294d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
294e0 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72  , &a[1]) ) retur
294f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
29500 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
29510 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
29520 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
29530 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20  WIN32_AV_RETRY, 
29540 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c  (void*)a);.  sql
29550 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
29560 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
29570 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d  %d %d", rc, a[0]
29580 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[1]);.  Tcl_A
29590 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
295a0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
295b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
295c0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
295d0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
295e0 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
295f0 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a 2a 2a 20 54  andle DB.**.** T
29600 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
29610 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
29620 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
29630 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
29640 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
29650 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c  _WIN32_GET_HANDL
29660 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
29670 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
29680 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
29690 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44  andle(.  ClientD
296a0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
296b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
296c0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
296d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
296e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
296f0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
29700 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
29710 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
29720 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
29730 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
29740 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29750 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
29760 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
29770 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
29780 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
29790 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
297a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44    int rc;.  HAND
297b0 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  LE hFile = NULL;
297c0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
297d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
297e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
297f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
29800 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
29810 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
29820 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
29830 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
29840 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
29850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29860 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29870 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29880 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29890 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
298a0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
298b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
298c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
298d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
298e0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
298f0 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
29900 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  NDLE,.          
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29    (void*)&hFile)
29930 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
29940 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
29950 7a 2c 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20  z, "%d %p", rc, 
29960 28 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20  (void*)hFile);. 
29970 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29980 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
29990 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
299a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
299b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
299c0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
299d0 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e  et_handle DB HAN
299e0 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  DLE.**.** This T
299f0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
29a00 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
29a10 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
29a20 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
29a30 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
29a40 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63  2_SET_HANDLE opc
29a50 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29a60 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
29a70 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
29a80 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
29a90 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
29aa0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
29ab0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
29ac0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
29ad0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
29ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
29af0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
29b00 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
29b10 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
29b20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
29b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29b40 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29b50 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
29b60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
29b70 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
29b80 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
29b90 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
29ba0 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
29bb0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
29bc0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
29bd0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
29be0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
29bf0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
29c00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
29c10 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
29c20 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
29c30 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
29c40 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
29c50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29c60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29c70 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29c80 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29c90 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29ca0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
29cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29cc0 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
29cd0 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
29ce0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29cf0 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
29d00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29d10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
29d20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29d30 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
29d40 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
29d50 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
29d80 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
29d90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
29da0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
29db0 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
29dc0 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
29dd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29de0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
29df0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29e00 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
29e10 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
29e20 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
29e30 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
29e40 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
29e50 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
29e60 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
29e70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
29e80 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
29e90 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
29ea0 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
29eb0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
29ec0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
29ed0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
29ee0 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65  sist_wal(.  Clie
29ef0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29f00 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
29f10 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
29f20 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
29f30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29f40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29f50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29f60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29f70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29f80 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29f90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29fa0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
29fb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29fc0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
29fd0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
29fe0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
29ff0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2a000 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63  nt bPersist;.  c
2a010 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
2a020 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
2a030 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2a040 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2a050 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2a060 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
2a070 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2a080 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
2a090 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
2a0a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a0b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a0c0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a0d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2a0e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2a0f0 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
2a100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a110 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
2a120 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2a130 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72  , objv[2], &bPer
2a140 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54  sist) ) return T
2a150 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2a160 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
2a170 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
2a180 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
2a190 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a  SIST_WAL, (void*
2a1a0 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73  )&bPersist);.  s
2a1b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2a1c0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
2a1d0 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73  d %d", rc, bPers
2a1e0 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ist);.  Tcl_Appe
2a1f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a200 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
2a210 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
2a220 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
2a230 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
2a240 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
2a250 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c  write DB PSOW-FL
2a260 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
2a270 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
2a280 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
2a290 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
2a2a0 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
2a2b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
2a2c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f  SAFE_OVERWRITE o
2a2d0 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
2a2e0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2a2f0 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
2a300 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
2a310 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ite(.  ClientDat
2a320 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2a330 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2a340 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2a350 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2a360 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a370 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a380 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a390 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a3a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2a3b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2a3c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2a3d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2a3e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2a3f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2a400 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2a410 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2a420 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b  int rc;.  int b;
2a430 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
2a440 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
2a450 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2a460 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a470 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2a480 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
2a490 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
2a4a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
2a4b0 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
2a4c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2a4d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a4e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2a4f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2a500 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2a510 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
2a520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a530 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
2a540 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2a550 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2a560 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2a570 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
2a580 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2a590 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54  ol(db,NULL,SQLIT
2a5a0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
2a5b0 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69  E_OVERWRITE,(voi
2a5c0 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65  d*)&b);.  sqlite
2a5d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2a5e0 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
2a5f0 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f  , rc, b);.  Tcl_
2a600 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2a610 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
2a620 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2a630 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
2a640 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
2a650 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44  ontrol_vfsname D
2a660 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
2a670 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
2a680 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
2a690 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65  he stack of VFSe
2a6a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a6b0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66   SQLITE_TCLAPI f
2a6c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
2a6d0 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ame(.  ClientDat
2a6e0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2a6f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2a700 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2a710 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2a720 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a730 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a740 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a750 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a760 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2a770 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2a780 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2a790 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2a7a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2a7b0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2a7c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2a7d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2a7e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
2a7f0 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
2a800 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d  char *zVfsName =
2a810 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
2a820 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
2a830 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2a840 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2a850 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2a860 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
2a870 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
2a880 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
2a890 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44  , 0), " DB ?AUXD
2a8a0 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  B?", 0);.    ret
2a8b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a8c0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2a8d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2a8e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2a8f0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2a900 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a910 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
2a920 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
2a930 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
2a940 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2a950 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   }.  sqlite3_fil
2a960 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
2a970 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
2a980 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69  NTL_VFSNAME,(voi
2a990 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  d*)&zVfsName);. 
2a9a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a9b0 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61  t(interp, zVfsNa
2a9c0 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2a9d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56   sqlite3_free(zV
2a9e0 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  fsName);.  retur
2a9f0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
2aa00 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
2aa10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70  ile_control_temp
2aa20 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58  filename DB ?AUX
2aa30 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  DB?.**.** Return
2aa40 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
2aa50 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2aa60 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  lename.*/.static
2aa70 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2aa80 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
2aa90 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20  tempfilename(.  
2aaa0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2aab0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2aac0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2aad0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2aae0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2aaf0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2ab00 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2ab10 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2ab20 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2ab30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2ab40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ab50 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2ab60 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2ab70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2ab80 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2ab90 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
2aba0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2abb0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
2abc0 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
2abd0 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  TName = 0;..  if
2abe0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
2abf0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2ac00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ac10 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2ac20 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2ac30 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
2ac40 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2ac50 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
2ac60 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a  B ?AUXDB?", 0);.
2ac70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ac80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2ac90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2aca0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2acb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2acc0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2acd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ace0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
2acf0 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
2ad00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ad10 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [2]);.  }.  sqli
2ad20 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2ad30 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  (db, zDbName, SQ
2ad40 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
2ad50 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29  ILENAME, (void*)
2ad60 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  &zTName);.  Tcl_
2ad70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ad80 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68  erp, zTName, (ch
2ad90 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
2ada0 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
2adb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2adc0 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
2add0 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76  cmd:   sqlite3_v
2ade0 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20  fs_list.**.**   
2adf0 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73  Return a tcl lis
2ae00 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
2ae10 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65   names of all re
2ae20 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a  gistered vfs's..
2ae30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2ae40 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f  LITE_TCLAPI vfs_
2ae50 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  list(.  ClientDa
2ae60 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2ae70 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2ae80 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2ae90 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2aea0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2aeb0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2aec0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2aed0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2aee0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2aef0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2af00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2af10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2af20 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2af30 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2af40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2af50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2af60 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Vfs;.  Tcl_Obj *
2af70 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
2af80 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  j();.  if( objc!
2af90 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
2afa0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2afb0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
2afc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2afd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
2afe0 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66  (pVfs=sqlite3_vf
2aff0 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b  s_find(0); pVfs;
2b000 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78   pVfs=pVfs->pNex
2b010 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  t){.    Tcl_List
2b020 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b030 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
2b040 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2b050 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29  pVfs->zName, -1)
2b060 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
2b070 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2b080 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72  , pRet);.  retur
2b090 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
2b0a0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
2b0b0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20  qlite3_limit DB 
2b0c0 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54  ID VALUE.**.** T
2b0d0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
2b0e0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
2b0f0 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65  _limit interface
2b100 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
2b110 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
2b120 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
2b130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2b140 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2b150 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74  _limit(.  Client
2b160 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2b170 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2b180 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2b190 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2b1a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b1b0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2b1c0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2b1d0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2b1e0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2b1f0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2b200 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b210 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2b220 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2b230 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2b240 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2b250 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2b260 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61  .  int rc;.  sta
2b270 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2b280 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
2b290 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64  ame;.     int id
2b2a0 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a  ;.  } aId[] = {.
2b2b0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2b2c0 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  MIT_LENGTH",    
2b2d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2b2e0 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2b300 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2b310 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20  IT_SQL_LENGTH", 
2b320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2b330 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
2b340 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2b350 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
2b360 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20  T_COLUMN",      
2b370 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2b380 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
2b390 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2b3a0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2b3b0 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20  _EXPR_DEPTH",   
2b3c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2b3d0 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
2b3e0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b3f0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2b400 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22  COMPOUND_SELECT"
2b410 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
2b420 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2b430 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  CT      },.    {
2b440 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
2b450 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20  DBE_OP",        
2b460 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2b470 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
2b480 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2b490 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  "SQLITE_LIMIT_FU
2b4a0 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20  NCTION_ARG",    
2b4b0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2b4c0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
2b4d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b4e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
2b4f0 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20  ACHED",         
2b500 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2b510 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
2b520 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
2b530 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
2b540 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22  _PATTERN_LENGTH"
2b550 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
2b560 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
2b570 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  TH  },.    { "SQ
2b580 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
2b590 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20  BLE_NUMBER",    
2b5a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
2b5b0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
2b5c0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
2b5d0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
2b5e0 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
2b5f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
2b600 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
2b610 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2b620 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
2b630 54 48 52 45 41 44 53 22 2c 20 20 20 20 20 20 53  THREADS",      S
2b640 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
2b650 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
2b660 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   },.    .    /* 
2b670 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73  Out of range tes
2b680 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b  t cases */.    {
2b690 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
2b6a0 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20  OOSMALL",       
2b6b0 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20       -1,        
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2b6e0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
2b6f0 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20  OBIG",          
2b700 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2b710 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2b  _WORKER_THREADS+
2b720 31 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20  1     },.  };.  
2b730 69 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b 0a 20  int i, id = 0;. 
2b740 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73   int val;.  cons
2b750 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20  t char *zId;..  
2b760 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
2b770 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2b780 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2b790 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2b7a0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
2b7b0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
2b7c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
2b7d0 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55  0), " DB ID VALU
2b7e0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
2b7f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b800 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2b810 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2b820 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2b830 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2b840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b850 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zId = Tcl_GetStr
2b860 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2b870 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2b880 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
2b890 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
2b8a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c   if( strcmp(zId,
2b8b0 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d   aId[i].zName)==
2b8c0 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20  0 ){.      id = 
2b8d0 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20  aId[i].id;.     
2b8e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2b8f0 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
2b900 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
2b910 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  d[0]) ){.    Tcl
2b920 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2b930 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  terp, "unknown l
2b940 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49  imit type: ", zI
2b950 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  d, (char*)0);.  
2b960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b970 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2b980 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2b990 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2b9a0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
2b9b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
2b9c0 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  = sqlite3_limit(
2b9d0 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20  db, id, val);.  
2b9e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2b9f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2ba00 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
2ba10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
2ba20 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2ba30 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
2ba40 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  e.**.** Save the
2ba50 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73   state of the ps
2ba60 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
2ba70 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  er generator..**
2ba80 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
2ba90 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73  e, verify that s
2baa0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2bab0 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77  rol works even w
2bac0 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  hen.** called wi
2bad0 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e  th an out-of-ran
2bae0 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  ge opcode..*/.st
2baf0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2bb00 54 43 4c 41 50 49 20 73 61 76 65 5f 70 72 6e 67  TCLAPI save_prng
2bb10 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
2bb20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2bb30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2bb40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2bb50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2bb60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2bb70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2bb80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2bb90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2bba0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2bbb0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2bbc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2bbd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2bbe0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2bbf0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2bc00 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2bc10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
2bc20 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2bc30 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72  l(9999);.  asser
2bc40 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63  t( rc==0 );.  rc
2bc50 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
2bc60 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61  control(-1);.  a
2bc70 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
2bc80 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2bc90 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2bca0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
2bcb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2bcc0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
2bcd0 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e  md:  restore_prn
2bce0 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
2bcf0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2bd00 41 50 49 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  API restore_prng
2bd10 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
2bd20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2bd30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2bd40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2bd50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2bd60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2bd70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2bd80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2bd90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2bda0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2bdb0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2bdc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2bdd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2bde0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2bdf0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2be00 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2be10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2be20 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2be30 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
2be40 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e  STORE);.  return
2be50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
2be60 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f   tclcmd:  reset_
2be70 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74  prng_state.*/.st
2be80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2be90 54 43 4c 41 50 49 20 72 65 73 65 74 5f 70 72 6e  TCLAPI reset_prn
2bea0 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
2beb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2bec0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2bed0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2bee0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2bef0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2bf00 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2bf10 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2bf20 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2bf30 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2bf40 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2bf50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2bf60 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2bf70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bf80 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2bf90 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2bfa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
2bfb0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
2bfc0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
2bfd0 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  ESET);.  return 
2bfe0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2bff0 20 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61   tclcmd:  databa
2c000 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  se_may_be_corrup
2c010 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  t.**.** Indicate
2c020 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
2c030 69 6c 65 73 20 6d 69 67 68 74 20 62 65 20 63 6f  iles might be co
2c040 72 72 75 70 74 2e 20 49 6e 20 6f 74 68 65 72 20  rrupt. In other 
2c050 77 6f 72 64 73 2c 20 73 65 74 20 74 68 65 20 6e  words, set the n
2c060 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f  ormal.** state o
2c070 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  f operation..*/.
2c080 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2c090 45 5f 54 43 4c 41 50 49 20 64 61 74 61 62 61 73  E_TCLAPI databas
2c0a0 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
2c0b0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2c0c0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
2c0d0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
2c0e0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
2c0f0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
2c100 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2c110 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2c120 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2c130 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2c140 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c160 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2c170 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2c180 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2c190 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2c1a0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
2c1b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2c1c0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2c1d0 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
2c1e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2c1f0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
2c200 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65  clcmd:  database
2c210 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a  _never_corrupt.*
2c220 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
2c230 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
2c240 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c  s are always wel
2c250 6c 2d 66 6f 72 6d 65 64 2e 20 54 68 69 73 20 65  l-formed. This e
2c260 6e 61 62 6c 65 73 0a 2a 2a 20 65 78 74 72 61 20  nables.** extra 
2c270 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2c280 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f  nts that test co
2c290 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72  nditions that ar
2c2a0 65 20 61 6c 77 61 79 73 20 74 72 75 65 0a 2a 2a  e always true.**
2c2b0 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64   for well-formed
2c2c0 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73   databases..*/.s
2c2d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2c2e0 5f 54 43 4c 41 50 49 20 64 61 74 61 62 61 73 65  _TCLAPI database
2c2f0 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a  _never_corrupt(.
2c300 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2c310 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
2c320 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
2c330 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
2c340 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
2c350 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2c360 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2c370 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2c380 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2c390 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c3b0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2c3c0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2c3d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2c3e0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2c3f0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
2c400 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2c410 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2c420 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
2c430 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  1);.  return TCL
2c440 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
2c450 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74  lcmd:  pcache_st
2c460 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ats.*/.static in
2c470 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2c480 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74  test_pcache_stat
2c490 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
2c4a0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2c4b0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2c4c0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2c4d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2c4e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2c4f0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2c500 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2c510 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2c520 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2c530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2c540 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2c550 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2c560 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2c570 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2c580 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
2c590 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e  nt nMin;.  int n
2c5a0 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72  Max;.  int nCurr
2c5b0 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79  ent;.  int nRecy
2c5c0 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62  clable;.  Tcl_Ob
2c5d0 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69  j *pRet;..  sqli
2c5e0 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26  te3PcacheStats(&
2c5f0 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c  nCurrent, &nMax,
2c600 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c   &nMin, &nRecycl
2c610 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d  able);..  pRet =
2c620 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
2c630 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c640 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c650 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
2c660 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e  tringObj("curren
2c670 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  t", -1));.  Tcl_
2c680 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c690 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2c6a0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2c6b0 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54  (nCurrent));.  T
2c6c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c6d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c6e0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
2c6f0 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31  ingObj("max", -1
2c700 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2c710 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c720 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2c730 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29  _NewIntObj(nMax)
2c740 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2c750 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c760 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
2c770 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
2c780 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  n", -1));.  Tcl_
2c790 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c7a0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2c7b0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2c7c0 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMin));.  Tcl_L
2c7d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c7e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
2c7f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2c800 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c  bj("recyclable",
2c810 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
2c820 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c830 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2c840 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52  Tcl_NewIntObj(nR
2c850 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20  ecyclable));..  
2c860 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2c870 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
2c880 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2c890 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2c8a0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
2c8b0 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
2c8c0 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  oid test_unlock_
2c8d0 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a  notify_cb(void *
2c8e0 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  *aArg, int nArg)
2c8f0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
2c900 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b  r(ii=0; ii<nArg;
2c910 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f   ii++){.    Tcl_
2c920 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65  EvalEx((Tcl_Inte
2c930 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22  rp *)aArg[ii], "
2c940 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
2c950 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  -1, TCL_EVAL_GLO
2c960 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  BAL);.  }.}.#end
2c970 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2c980 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
2c990 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  Y */../*.** tclc
2c9a0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c  md:  sqlite3_unl
2c9b0 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f  ock_notify db.*/
2c9c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c9d0 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
2c9e0 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 53  IFY.static int S
2c9f0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2ca00 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  t_unlock_notify(
2ca10 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2ca20 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2ca30 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2ca40 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2ca50 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2ca60 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2ca70 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2ca80 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2caa0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2cab0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2cac0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2cad0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2cae0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
2caf0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2cb00 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
2cb10 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
2cb20 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2cb30 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
2cb40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2cb50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2cb60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2cb70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2cb80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2cb90 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2cba0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2cbb0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2cbc0 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  3_unlock_notify(
2cbd0 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  db, test_unlock_
2cbe0 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69 64  notify_cb, (void
2cbf0 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 63   *)interp);.  Tc
2cc00 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2cc10 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
2cc20 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
2cc30 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
2cc40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2cc50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  dif../*.** tclcm
2cc60 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  d:  sqlite3_wal_
2cc70 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f 4e  checkpoint db ?N
2cc80 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME?.*/.static i
2cc90 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2cca0 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70   test_wal_checkp
2ccb0 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  oint(.  ClientDa
2ccc0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2ccd0 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2cce0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2ccf0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2cd00 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2cd10 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2cd20 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2cd30 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2cd40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2cd50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2cd60 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2cd70 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2cd80 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2cd90 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
2cda0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2cdb0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2cdc0 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
2cdd0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2cde0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2cdf0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2ce00 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72   ?NAME?");.    r
2ce10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ce20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
2ce30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2ce40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2ce50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
2ce60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ce70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2ce80 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
2ce90 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
2cea0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2ceb0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2cec0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
2ced0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f  db, zDb);.  Tcl_
2cee0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2cef0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2cf00 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2cf10 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2cf20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2cf30 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
2cf40 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
2cf50 74 5f 76 32 20 64 62 20 4d 4f 44 45 20 3f 4e 41  t_v2 db MODE ?NA
2cf60 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ME?.**.** This c
2cf70 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 74 68 65  ommand calls the
2cf80 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
2cf90 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 69  v2() function wi
2cfa0 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
2cfb0 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75 6d 65 6e  .** mode argumen
2cfc0 74 20 28 70 61 73 73 69 76 65 2c 20 66 75 6c 6c  t (passive, full
2cfd0 20 6f 72 20 72 65 73 74 61 72 74 29 2e 20 49 66   or restart). If
2cfe0 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 64 61   present, the da
2cff0 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e  tabase name.** N
2d000 41 4d 45 20 69 73 20 70 61 73 73 65 64 20 61 73  AME is passed as
2d010 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2d020 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63 68 65 63  ment to wal_chec
2d030 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20 49 66 20  kpoint_v2(). If 
2d040 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d 45 20 61  it the.** NAME a
2d050 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 70  rgument is not p
2d060 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c 4c 20 70  resent, a NULL p
2d070 6f 69 6e 74 65 72 20 69 73 20 70 61 73 73 65 64  ointer is passed
2d080 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
2d090 49 66 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  If wal_checkpoin
2d0a0 74 5f 76 32 28 29 20 72 65 74 75 72 6e 73 20 61  t_v2() returns a
2d0b0 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  ny value other t
2d0c0 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  han SQLITE_BUSY 
2d0d0 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c  or.** SQLITE_OK,
2d0e0 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6d 6d 61   then this comma
2d0f0 6e 64 20 72 65 74 75 72 6e 73 20 54 43 4c 5f 45  nd returns TCL_E
2d100 52 52 4f 52 2e 20 54 68 65 20 54 63 6c 20 72 65  RROR. The Tcl re
2d110 73 75 6c 74 20 69 73 20 73 65 74 0a 2a 2a 20 74  sult is set.** t
2d120 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
2d130 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
2d140 6d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  m sqlite3_errmsg
2d150 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ()..**.** Otherw
2d160 69 73 65 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e  ise, this comman
2d170 64 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74  d returns a list
2d180 20 6f 66 20 74 68 72 65 65 20 69 6e 74 65 67 65   of three intege
2d190 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  rs. The first in
2d1a0 74 65 67 65 72 0a 2a 2a 20 69 73 20 31 20 69 66  teger.** is 1 if
2d1b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 61 73   SQLITE_BUSY was
2d1c0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 30 20   returned, or 0 
2d1d0 6f 74 68 65 72 77 69 73 65 2e 20 54 68 65 20 66  otherwise. The f
2d1e0 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74  ollowing two int
2d1f0 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 74 68 65  egers.** are the
2d200 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
2d210 20 76 69 61 20 74 68 65 20 6f 75 74 70 75 74 20   via the output 
2d220 70 61 72 61 6d 65 74 65 72 73 20 62 79 20 77 61  parameters by wa
2d230 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
2d240 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  ) -.** the numbe
2d250 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
2d260 68 65 20 6c 6f 67 20 61 6e 64 20 74 68 65 20 6e  he log and the n
2d270 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
2d280 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a 20 74 68  in the log.** th
2d290 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 65  at have been che
2d2a0 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74  ckpointed..*/.st
2d2b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2d2c0 54 43 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f  TCLAPI test_wal_
2d2d0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
2d2e0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2d2f0 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
2d300 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
2d310 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2d320 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2d330 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2d340 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2d350 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2d360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d370 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2d380 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2d390 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2d3a0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2d3b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
2d3c0 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  *zDb = 0;.  sqli
2d3d0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
2d3e0 63 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b  c;..  int eMode;
2d3f0 0a 20 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35  .  int nLog = -5
2d400 35 35 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20  55;.  int nCkpt 
2d410 3d 20 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62  = -555;.  Tcl_Ob
2d420 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73  j *pRet;..  cons
2d430 74 20 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d  t char * aMode[]
2d440 20 3d 20 7b 20 22 70 61 73 73 69 76 65 22 2c 20   = { "passive", 
2d450 22 66 75 6c 6c 22 2c 20 22 72 65 73 74 61 72 74  "full", "restart
2d460 22 2c 20 22 74 72 75 6e 63 61 74 65 22 2c 20 30  ", "truncate", 0
2d470 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   };.  assert( SQ
2d480 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2d490 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
2d4a0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
2d4b0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
2d4c0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
2d4d0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
2d4e0 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20  _RESTART==2 );. 
2d4f0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2d500 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
2d510 41 54 45 3d 3d 33 20 29 3b 0a 0a 20 20 69 66 28  ATE==3 );..  if(
2d520 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
2d530 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
2d540 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2d550 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2d560 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a   MODE ?NAME?");.
2d570 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d580 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2d590 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
2d5a0 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
2d5b0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
2d5c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2d5d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2d5e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2d5f0 31 5d 29 2c 20 26 64 62 29 20 7c 7c 20 28 0a 20  1]), &db) || (. 
2d600 20 20 20 20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c       TCL_OK!=Tcl
2d610 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  _GetIntFromObj(0
2d620 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f 64  , objv[2], &eMod
2d630 65 29 0a 20 20 20 26 26 20 54 43 4c 5f 4f 4b 21  e).   && TCL_OK!
2d640 3d 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  =Tcl_GetIndexFro
2d650 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2d660 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f  v[2], aMode, "mo
2d670 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20  de", 0, &eMode) 
2d680 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72  .  )){.    retur
2d690 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d6a0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2d6b0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2d6c0 76 32 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64  v2(db, zDb, eMod
2d6d0 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74  e, &nLog, &nCkpt
2d6e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2d6f0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
2d700 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
2d710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
2d720 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45  rCode = sqlite3E
2d730 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20  rrName(rc);.    
2d740 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2d750 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
2d760 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2d770 74 65 72 70 2c 20 7a 45 72 72 43 6f 64 65 2c 20  terp, zErrCode, 
2d780 22 20 2d 20 22 2c 20 28 63 68 61 72 20 2a 29 73  " - ", (char *)s
2d790 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
2d7a0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
2d7b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d7c0 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ..  pRet = Tcl_N
2d7d0 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c  ewObj();.  Tcl_L
2d7e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2d7f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
2d800 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2d810 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f  rc==SQLITE_BUSY?
2d820 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  1:0));.  Tcl_Lis
2d830 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2d840 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2d850 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c  Tcl_NewIntObj(nL
2d860 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  og));.  Tcl_List
2d870 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2d880 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
2d890 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b  cl_NewIntObj(nCk
2d8a0 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  pt));.  Tcl_SetO
2d8b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2d8c0 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72   pRet);..  retur
2d8d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2d8e0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2d8f0 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
2d900 6b 70 6f 69 6e 74 20 64 62 20 56 41 4c 55 45 0a  kpoint db VALUE.
2d910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2d920 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2d930 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
2d940 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
2d950 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2d960 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2d970 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d980 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2d990 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2d9a0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2d9b0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2d9c0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2d9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2d9e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2d9f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2da00 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2da10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2da20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2da30 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 56  int rc;.  int iV
2da40 61 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a 63  al;...  if( objc
2da50 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
2da60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2da70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2da80 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65   VALUE");.    re
2da90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2daa0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
2dab0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2dac0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2dad0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
2dae0 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
2daf0 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d  omObj(0, objv[2]
2db00 2c 20 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20 20  , &iVal).  ){.  
2db10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2db20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
2db30 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
2db40 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  checkpoint(db, i
2db50 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  Val);.  Tcl_Rese
2db60 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2db70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2db80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
2db90 74 20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65  t char *zErrCode
2dba0 20 3d 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   = sqlite3ErrNam
2dbb0 65 28 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 53  e(rc);.    Tcl_S
2dbc0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2dbd0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
2dbe0 67 4f 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20 2d  gObj(zErrCode, -
2dbf0 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
2dc00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2dc10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2dc20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
2dc30 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  d:  test_sqlite3
2dc40 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f  _log ?SCRIPT?.*/
2dc50 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c  .static struct L
2dc60 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54  ogCallback {.  T
2dc70 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65  cl_Interp *pInte
2dc80 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
2dc90 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61  Obj;.} logcallba
2dca0 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61  ck = {0, 0};.sta
2dcb0 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c  tic void xLogcal
2dcc0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73  lback(void *unus
2dcd0 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61  ed, int err, cha
2dce0 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f  r *zMsg){.  Tcl_
2dcf0 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f  Obj *pNew = Tcl_
2dd00 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67  DuplicateObj(log
2dd10 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
2dd20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2dd30 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f  nt(pNew);.  Tcl_
2dd40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2dd50 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70  ment(.      0, p
2dd60 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  New, Tcl_NewStri
2dd70 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
2dd80 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20  Name(err), -1). 
2dd90 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62   );.  Tcl_ListOb
2dda0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2ddb0 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
2ddc0 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d  tringObj(zMsg, -
2ddd0 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
2dde0 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  bjEx(logcallback
2ddf0 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20  .pInterp, pNew, 
2de00 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
2de10 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
2de20 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
2de30 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74  ount(pNew);.}.st
2de40 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2de50 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 69  TCLAPI test_sqli
2de60 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e  te3_log(.  Clien
2de70 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2de80 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2de90 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2dea0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2deb0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2dec0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2ded0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2dee0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2def0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2df00 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2df10 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2df20 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2df30 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  */.){.  if( objc
2df40 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  >2 ){.    Tcl_Wr
2df50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2df60 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52  p, 1, objv, "SCR
2df70 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IPT");.    retur
2df80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2df90 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61  .  if( logcallba
2dfa0 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54  ck.pObj ){.    T
2dfb0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2dfc0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
2dfd0 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  );.    logcallba
2dfe0 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20  ck.pObj = 0;.   
2dff0 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e   logcallback.pIn
2e000 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73 71  terp = 0;.    sq
2e010 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
2e020 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
2e030 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f 69 64 2a  (void*)0, (void*
2e040 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  )0);.  }.  if( o
2e050 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67  bjc>1 ){.    log
2e060 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20  callback.pObj = 
2e070 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c  objv[1];.    Tcl
2e080 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f  _IncrRefCount(lo
2e090 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
2e0a0 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
2e0b0 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  .pInterp = inter
2e0c0 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  p;.    sqlite3_c
2e0d0 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
2e0e0 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c  FIG_LOG, xLogcal
2e0f0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 30 29  lback, (void*)0)
2e100 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
2e110 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2e120 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20      tcl_objproc 
2e130 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53  COMMANDNAME ARGS
2e140 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20  ....**.** Run a 
2e150 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e  TCL command usin
2e160 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e  g its objProc in
2e170 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20  terface.  Throw 
2e180 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74  an error if.** t
2e190 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  he command has n
2e1a0 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  o objProc interf
2e1b0 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
2e1c0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2e1d0 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20   runAsObjProc(. 
2e1e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2e1f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2e200 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2e210 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2e220 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2e230 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
2e240 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62  mdInfo;.  if( ob
2e250 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
2e260 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2e270 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
2e280 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
2e290 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e2a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54  OR;.  }.  if( !T
2e2b0 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
2e2c0 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
2e2d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2e2e0 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
2e2f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2e300 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
2e310 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
2e320 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
2e330 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2e340 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
2e350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e360 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2e370 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
2e380 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
2e390 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2e3a0 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73  rp, "command has
2e3b0 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a   no objProc: ",.
2e3c0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
2e3d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2e3e0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
2e3f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e400 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
2e410 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
2e420 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  (cmdInfo.objClie
2e430 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
2e440 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b  objc-1, objv+1);
2e450 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2e460 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2e470 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  /*.** WARNING: T
2e480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
2e490 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c  ction, printExpl
2e4a0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69  ainQueryPlan() i
2e4b0 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f  s an exact.** co
2e4c0 70 79 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f  py of example co
2e4d0 64 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28  de from eqp.in (
2e4e0 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68  eqp.html). If th
2e4f0 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66  is code is modif
2e500 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ied,.** then the
2e510 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63   documentation c
2e520 6f 70 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  opy needs to be 
2e530 6d 6f 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c  modified as well
2e540 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ..*/./*.** Argum
2e550 65 6e 74 20 70 53 74 6d 74 20 69 73 20 61 20 70  ent pStmt is a p
2e560 72 65 70 61 72 65 64 20 53 51 4c 20 73 74 61 74  repared SQL stat
2e570 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  ement. This func
2e580 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a  tion compiles.**
2e590 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
2e5a0 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74  Y PLAN command t
2e5b0 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  o report on the 
2e5c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2e5d0 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74  nt,.** and print
2e5e0 73 20 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20  s the report to 
2e5f0 73 74 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69  stdout using pri
2e600 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72  ntf()..*/.int pr
2e610 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2e620 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  lan(sqlite3_stmt
2e630 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73   *pStmt){.  cons
2e640 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
2e650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e660 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68  nput SQL */.  ch
2e670 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20  ar *zExplain;   
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e690 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49   SQL with EXPLAI
2e6a0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65  N QUERY PLAN pre
2e6b0 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  pended */.  sqli
2e6c0 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
2e6d0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  in;         /* C
2e6e0 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20  ompiled EXPLAIN 
2e6f0 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
2e700 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nd */.  int rc; 
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2e730 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  n code from sqli
2e740 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
2e750 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71   */..  zSql = sq
2e760 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
2e770 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2e780 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2e790 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61  ERROR;..  zExpla
2e7a0 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  in = sqlite3_mpr
2e7b0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55  intf("EXPLAIN QU
2e7c0 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53  ERY PLAN %s", zS
2e7d0 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c  ql);.  if( zExpl
2e7e0 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ain==0 ) return 
2e7f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
2e800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2e810 65 70 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33  epare_v2(sqlite3
2e820 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
2e830 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c  ), zExplain, -1,
2e840 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
2e850 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e860 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20  Explain);.  if( 
2e870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2e880 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
2e890 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
2e8a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45  =sqlite3_step(pE
2e8b0 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69  xplain) ){.    i
2e8c0 6e 74 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73  nt iSelectid = s
2e8d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2e8e0 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a  t(pExplain, 0);.
2e8f0 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
2e900 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2e910 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29  int(pExplain, 1)
2e920 3b 0a 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20  ;.    int iFrom 
2e930 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2e940 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32  _int(pExplain, 2
2e950 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
2e960 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f  r *zDetail = (co
2e970 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
2e980 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2e990 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20  Explain, 3);..  
2e9a0 20 20 70 72 69 6e 74 66 28 22 25 64 20 25 64 20    printf("%d %d 
2e9b0 25 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63  %d %s\n", iSelec
2e9c0 74 69 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72  tid, iOrder, iFr
2e9d0 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20  om, zDetail);.  
2e9e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
2e9f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
2ea00 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69  plain);.}..stati
2ea10 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2ea20 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  API test_print_e
2ea30 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  qp(.  void * cli
2ea40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2ea50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2ea60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2ea70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2ea80 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
2ea90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2eaa0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
2eab0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2eac0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2ead0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2eae0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
2eaf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2eb00 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
2eb10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2eb20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2eb30 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
2eb40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2eb50 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45  R;.  rc = printE
2eb60 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2eb70 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69  pStmt);.  /* Thi
2eb80 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57  s is needed on W
2eb90 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61  indows so that a
2eba0 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67   test case using
2ebb0 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
2ebc0 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20  tion can open a 
2ebd0 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65  read pipe and ge
2ebe0 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a  t the output of.
2ebf0 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69    ** printExplai
2ec00 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d  nQueryPlan() imm
2ec10 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
2ec20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
2ec30 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2ec40 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2ec50 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2ec60 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2ec70 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
2ec80 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2ec90 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2eca0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2ecb0 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e  ntrol VERB ARGS.
2ecc0 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
2ecd0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
2ece0 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  est_test_control
2ecf0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2ed00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2ed10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2ed20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2ed30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ed40 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72  .){.  struct Ver
2ed50 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b {.    const ch
2ed60 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
2ed70 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b  nt i;.  } aVerb[
2ed80 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c  ] = {.    { "SQL
2ed90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2eda0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 20  ALTIME_FAULT",  
2edb0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2edc0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
2edd0 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c  T }, .    { "SQL
2ede0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
2edf0 54 45 52 5f 4d 4d 41 50 22 2c 20 20 20 20 20 20  TER_MMAP",      
2ee00 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2ee10 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20 20  L_SORTER_MMAP   
2ee20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c    }, .    { "SQL
2ee30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2ee40 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20 20 20  OSTER",         
2ee50 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2ee60 4c 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20  L_IMPOSTER      
2ee70 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2ee80 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54 45  TE_TESTCTRL_INTE
2ee90 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 22 2c  RNAL_FUNCTIONS",
2eea0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2eeb0 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49  _INTERNAL_FUNCTI
2eec0 4f 4e 53 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  ONS},.  };.  int
2eed0 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46   iVerb;.  int iF
2eee0 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lag;.  int rc;..
2eef0 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
2ef00 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2ef10 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2ef20 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53  objv, "VERB ARGS
2ef30 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
2ef40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ef50 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74  ..  rc = Tcl_Get
2ef60 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75  IndexFromObjStru
2ef70 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70  ct(.      interp
2ef80 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62  , objv[1], aVerb
2ef90 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30  , sizeof(aVerb[0
2efa0 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26  ]), "VERB", 0, &
2efb0 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28  iVerb.  );.  if(
2efc0 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
2efd0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61  turn rc;..  iFla
2efe0 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d  g = aVerb[iVerb]
2eff0 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46  .i;.  switch( iF
2f000 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20  lag ){.    case 
2f010 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f020 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f  INTERNAL_FUNCTIO
2f030 4e 53 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  NS:.    case SQL
2f040 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2f050 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
2f060 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
2f070 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
2f080 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2f090 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2f0a0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f  erp, 2, objv, "O
2f0b0 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20 20  NOFF");.        
2f0c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f0e0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
2f0f0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
2f100 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
2f110 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2f120 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
2f130 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2f140 69 46 6c 61 67 2c 20 76 61 6c 29 3b 0a 20 20 20  iFlag, val);.   
2f150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2f160 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2f170 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
2f180 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 69  _MMAP: {.      i
2f190 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73 71  nt val;.      sq
2f1a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
2f1b0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
2f1c0 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
2f1d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2f1e0 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c 49   2, objv, "DB LI
2f1f0 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72  MIT");.        r
2f200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f220 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2f230 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2f240 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
2f250 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2f260 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
2f270 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2f280 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2f290 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
2f2a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
2f2c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2f2d0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
2f2e0 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c 29  R_MMAP, db, val)
2f2f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2f300 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
2f310 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2f320 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  MPOSTER: {.     
2f330 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d   int onOff, tnum
2f340 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
2f350 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 20  ar *zDbName;.   
2f360 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a     sqlite3 *db;.
2f370 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
2f380 36 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  6 ){.        Tcl
2f390 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2f3a0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
2f3b0 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66 20  DB dbName onOff 
2f3c0 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  tnum");.        
2f3d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f3e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f3f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2f400 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2f410 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
2f420 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2f430 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2f440 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
2f450 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
2f460 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
2f470 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2f480 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
2f490 6f 6e 4f 66 66 29 20 29 20 72 65 74 75 72 6e 20  onOff) ) return 
2f4a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2f4b0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
2f4c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2f4d0 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20 29  bjv[5], &tnum) )
2f4e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f4f0 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
2f500 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2f510 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2f520 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a 44 62 4e  POSTER, db, zDbN
2f530 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d  ame, onOff, tnum
2f540 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2f550 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
2f560 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2f570 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2f580 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
2f590 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e  LITE_OS_UNIX.#in
2f5a0 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
2f5b0 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
2f5c0 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74  /resource.h>..st
2f5d0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2f5e0 54 43 4c 41 50 49 20 74 65 73 74 5f 67 65 74 72  TCLAPI test_getr
2f5f0 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20  usage(.  void * 
2f600 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2f610 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2f620 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2f630 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2f640 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
2f650 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72  buf[1024];.  str
2f660 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20  uct rusage r;.  
2f670 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69  memset(&r, 0, si
2f680 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72  zeof(r));.  getr
2f690 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
2f6a0 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69 74  F, &r);..  sqlit
2f6b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f6c0 6f 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20 20  of(buf), buf,.  
2f6d0 20 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25    "ru_utime=%d.%
2f6e0 30 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e  06d ru_stime=%d.
2f6f0 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25  %06d ru_minflt=%
2f700 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c  d ru_majflt=%d",
2f710 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
2f720 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69  utime.tv_sec, (i
2f730 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76  nt)r.ru_utime.tv
2f740 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74  _usec, .    (int
2f750 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73  )r.ru_stime.tv_s
2f760 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73 74  ec, (int)r.ru_st
2f770 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20  ime.tv_usec, .  
2f780 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66    (int)r.ru_minf
2f790 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61  lt, (int)r.ru_ma
2f7a0 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f  jflt.  );.  Tcl_
2f7b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2f7c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
2f7d0 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b  ngObj(buf, -1));
2f7e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2f7f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
2f800 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a  SQLITE_OS_WIN./*
2f810 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
2f820 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20  passed from the 
2f830 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f  main thread into
2f840 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c   the windows fil
2f850 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b  e locker.** back
2f860 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a  ground thread..*
2f870 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46 69  /.struct win32Fi
2f880 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61  leLocker {.  cha
2f890 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20  r *evName;      
2f8a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e   /* Name of even
2f8b0 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65  t to signal thre
2f8c0 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20  ad startup */.  
2f8d0 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
2f8e0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66      /* Handle of
2f8f0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2f900 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
2f910 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20  delay1;         
2f920 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20  /* Delay before 
2f930 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  locking */.  int
2f940 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20   delay2;        
2f950 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
2f960 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20   unlocking */.  
2f970 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20  int ok;         
2f980 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20      /* Finished 
2f990 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b  ok */.  int err;
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f9b0 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  rue if an error 
2f9c0 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e  occurs */.};.#en
2f9d0 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45  dif...#if SQLITE
2f9e0 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65  _OS_WIN.#include
2f9f0 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a   <process.h>./*.
2fa00 2a 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e  ** The backgroun
2fa10 64 20 74 68 72 65 61 64 20 74 68 61 74 20 64 6f  d thread that do
2fa20 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  es file locking.
2fa30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fa40 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 77 69 6e  SQLITE_CDECL win
2fa50 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76  32_file_locker(v
2fa60 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
2fa70 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69    struct win32Fi
2fa80 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73  leLocker *p = (s
2fa90 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
2faa0 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b  ocker*)pAppData;
2fab0 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65  .  if( p->evName
2fac0 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65   ){.    HANDLE e
2fad0 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56  v = OpenEvent(EV
2fae0 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45  ENT_MODIFY_STATE
2faf0 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61  , FALSE, p->evNa
2fb00 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76  me);.    if ( ev
2fb10 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65   ){.      SetEve
2fb20 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c  nt(ev);.      Cl
2fb30 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20  oseHandle(ev);. 
2fb40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2fb50 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70  ->delay1 ) Sleep
2fb60 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69  (p->delay1);.  i
2fb70 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68  f( LockFile(p->h
2fb80 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30  , 0, 0, 10000000
2fb90 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65  0, 0) ){.    Sle
2fba0 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20  ep(p->delay2);. 
2fbb0 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d     UnlockFile(p-
2fbc0 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30  >h, 0, 0, 100000
2fbd0 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  000, 0);.    p->
2fbe0 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ok = 1;.  }else{
2fbf0 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b  .    p->err = 1;
2fc00 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64  .  }.  CloseHand
2fc10 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68  le(p->h);.  p->h
2fc20 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
2fc30 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  1 = 0;.  p->dela
2fc40 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  y2 = 0;.}.#endif
2fc50 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2fc60 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c  WIN./*.**      l
2fc70 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46  ock_win32_file F
2fc80 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44  ILENAME DELAY1 D
2fc90 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20  ELAY2.**.** Get 
2fca0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e  an exclusive man
2fcb0 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66  ditory lock on f
2fcc0 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d  ile for DELAY2 m
2fcd0 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20  illiseconds..** 
2fce0 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c  Wait DELAY1 mill
2fcf0 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
2fd00 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f  acquiring the lo
2fd10 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
2fd20 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2fd30 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28  win32_file_lock(
2fd40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2fd50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2fd60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2fd70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2fd80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2fd90 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
2fda0 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
2fdb0 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32 5f  er x = { "win32_
2fdc0 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30  file_lock", 0, 0
2fdd0 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 63  , 0, 0, 0 };.  c
2fde0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2fdf0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42 75  name;.  char zBu
2fe00 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72 65  f[200];.  int re
2fe10 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c  try = 0;.  HANDL
2fe20 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77 52  E ev;.  DWORD wR
2fe30 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28 20  esult;.  .  if( 
2fe40 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21  objc!=4 && objc!
2fe50 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
2fe60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2fe70 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c  p, 1, objv, "FIL
2fe80 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c  ENAME DELAY1 DEL
2fe90 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AY2");.    retur
2fea0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2feb0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20 29  .  if( objc==1 )
2fec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2fed0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2fee0 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20 25  uf), zBuf, "%d %
2fef0 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20 20  d %d %d %d",.   
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff10 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20 78    x.ok, x.err, x
2ff20 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61 79  .delay1, x.delay
2ff30 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63 6c  2, x.h);.    Tcl
2ff40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2ff50 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
2ff60 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2ff70 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  n TCL_OK;.  }.  
2ff80 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72 65  while( x.h && re
2ff90 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72 65  try<30 ){.    re
2ffa0 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65 70  try++;.    Sleep
2ffb0 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (100);.  }.  if(
2ffc0 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f   x.h ){.    Tcl_
2ffd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ffe0 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63 68  erp, "busy", (ch
2fff0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
30000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30010 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
30020 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
30030 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64 65  , objv[2], &x.de
30040 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20 54  lay1) ) return T
30050 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
30060 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
30070 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
30080 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29 20  ], &x.delay2) ) 
30090 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
300a0 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ;.  zFilename = 
300b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
300c0 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d 20  jv[1]);.  x.h = 
300d0 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65  CreateFile(zFile
300e0 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52 45  name, GENERIC_RE
300f0 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54 45  AD|GENERIC_WRITE
30100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30110 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 7c  FILE_SHARE_READ|
30120 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
30130 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59 53  , 0, OPEN_ALWAYS
30140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30150 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
30160 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66 28  ORMAL, 0);.  if(
30170 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c   !x.h ){.    Tcl
30180 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
30190 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
301a0 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c  en file: ", zFil
301b0 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  ename, (char*)0)
301c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
301d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 76  _ERROR;.  }.  ev
301e0 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28 4e   = CreateEvent(N
301f0 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53 45  ULL, TRUE, FALSE
30200 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20 69  , x.evName);.  i
30210 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20 54  f ( !ev ){.    T
30220 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
30230 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
30240 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22 2c  create event: ",
30250 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61 72   x.evName, (char
30260 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
30270 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30280 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28 77    _beginthread(w
30290 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72  in32_file_locker
302a0 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29 3b  , 0, (void*)&x);
302b0 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20 69  .  Sleep(0);.  i
302c0 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20 57  f ( (wResult = W
302d0 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
302e0 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21 3d  ct(ev, 10000))!=
302f0 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29 7b  WAIT_OBJECT_0 ){
30300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30310 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
30320 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78 22  f), zBuf, "0x%x"
30330 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  , wResult);.    
30340 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
30350 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20 66  (interp, "wait f
30360 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c 20  ailed: ", zBuf, 
30370 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 43  (char*)0);.    C
30380 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
30390 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
303a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73  RROR;.  }.  Clos
303b0 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 72  eHandle(ev);.  r
303c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
303d0 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69 73  ./*.**      exis
303e0 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50 41  ts_win32_path PA
303f0 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  TH.**.** Returns
30400 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
30410 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
30420 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66 75  exists, whose fu
30430 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
30440 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65 64  me.** may exceed
30450 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73 20   260 characters 
30460 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
30470 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
30480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
30490 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32  ITE_TCLAPI win32
304a0 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20 20  _exists_path(.  
304b0 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
304c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
304d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
304e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
304f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
30500 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
30510 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
30520 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
30530 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a 20  objv, "PATH");. 
30540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
30550 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
30560 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
30570 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
30580 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65 74  anObj(.      Get
30590 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
305a0 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28   Tcl_GetUnicode(
305b0 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41 4c  objv[1]))!=INVAL
305c0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
305d0 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ES ));.  return 
305e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
305f0 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33 32        find_win32
30600 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a 2a  _file PATTERN.**
30610 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c 69  .** Returns a li
30620 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  st of entries in
30630 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68 61   a directory tha
30640 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63  t match the spec
30650 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a 2a  ified pattern,.*
30660 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  * whose fully qu
30670 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
30680 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61 72   exceed 248 char
30690 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
306a0 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a 2a  prefixed with.**
306b0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
306c0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
306d0 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6e 64 5f  LAPI win32_find_
306e0 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c  file(.  void *cl
306f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
30700 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
30710 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
30720 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
30730 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20  v[].){.  HANDLE 
30740 68 46 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56 41  hFindFile = INVA
30750 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
30760 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44  ;.  WIN32_FIND_D
30770 41 54 41 57 20 66 69 6e 64 44 61 74 61 3b 0a 20  ATAW findData;. 
30780 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62   Tcl_Obj *listOb
30790 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  j;.  DWORD lastE
307a0 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  rrno;.  if( objc
307b0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
307c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
307d0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41  rp, 1, objv, "PA
307e0 54 54 45 52 4e 22 29 3b 0a 20 20 20 20 72 65 74  TTERN");.    ret
307f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30800 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c 65 20 3d   }.  hFindFile =
30810 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 57 28   FindFirstFileW(
30820 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f  Tcl_GetUnicode(o
30830 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44 61  bjv[1]), &findDa
30840 74 61 29 3b 0a 20 20 69 66 28 20 68 46 69 6e 64  ta);.  if( hFind
30850 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  File==INVALID_HA
30860 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
30870 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
30880 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
30890 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
308a0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
308b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
308c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 4f  ROR;.  }.  listO
308d0 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  bj = Tcl_NewObj(
308e0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
308f0 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a  Count(listObj);.
30900 20 20 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f 4c    do {.    Tcl_L
30910 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
30920 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
30930 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69 63  Obj, Tcl_NewUnic
30940 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20 20 20 20  odeObj(.        
30950 66 69 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e 61  findData.cFileNa
30960 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  me, -1));.    Tc
30970 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
30980 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
30990 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57  istObj, Tcl_NewW
309a0 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20  ideIntObj(.     
309b0 20 20 20 66 69 6e 64 44 61 74 61 2e 64 77 46 69     findData.dwFi
309c0 6c 65 41 74 74 72 69 62 75 74 65 73 29 29 3b 0a  leAttributes));.
309d0 20 20 7d 20 77 68 69 6c 65 28 20 46 69 6e 64 4e    } while( FindN
309e0 65 78 74 46 69 6c 65 57 28 68 46 69 6e 64 46 69  extFileW(hFindFi
309f0 6c 65 2c 20 26 66 69 6e 64 44 61 74 61 29 20 29  le, &findData) )
30a00 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ;.  lastErrno = 
30a10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
30a20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21    if( lastErrno!
30a30 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61 73  =NO_ERROR && las
30a40 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f  tErrno!=ERROR_NO
30a50 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a 20  _MORE_FILES ){. 
30a60 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69     FindClose(hFi
30a70 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20 54 63 6c  ndFile);.    Tcl
30a80 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69  _DecrRefCount(li
30a90 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f  stObj);.    Tcl_
30aa0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
30ab0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
30ac0 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
30ad0 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
30ae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30af0 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28 68   }.  FindClose(h
30b00 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63 6c  FindFile);.  Tcl
30b10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
30b20 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a  terp, listObj);.
30b30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
30b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 64  .}../*.**      d
30b50 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65  elete_win32_file
30b60 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
30b70 44 65 6c 65 74 65 73 20 74 68 65 20 73 70 65 63  Deletes the spec
30b80 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68 6f 73  ified file, whos
30b90 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
30ba0 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
30bb0 64 20 32 36 30 0a 2a 2a 20 63 68 61 72 61 63 74  d 260.** charact
30bc0 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
30bd0 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
30be0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
30bf0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
30c00 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
30c10 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
30c20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
30c30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
30c40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
30c50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
30c60 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
30c70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
30c80 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
30c90 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
30ca0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
30cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
30cc0 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46 69  .  if( !DeleteFi
30cd0 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  leW(Tcl_GetUnico
30ce0 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
30cf0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
30d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
30d10 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
30d20 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
30d30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
30d40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
30d50 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
30d60 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
30d70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30d80 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f       make_win32_
30d90 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a  dir DIRECTORY.**
30da0 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20  .** Creates the 
30db0 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74  specified direct
30dc0 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  ory, whose fully
30dd0 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
30de0 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a  may exceed 248.*
30df0 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  * characters if 
30e00 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
30e10 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
30e20 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
30e30 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 6d 6b  _TCLAPI win32_mk
30e40 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  dir(.  void *cli
30e50 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
30e60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
30e70 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
30e80 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
30e90 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
30ea0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
30eb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
30ec0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49  rp, 1, objv, "DI
30ed0 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72  RECTORY");.    r
30ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
30ef0 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72 65 61  .  }.  if( !Crea
30f00 74 65 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c  teDirectoryW(Tcl
30f10 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
30f20 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20  [1]), NULL) ){. 
30f30 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
30f40 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
30f50 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
30f60 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
30f70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
30f80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
30f90 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
30fa0 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
30fb0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
30fc0 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33 32      remove_win32
30fd0 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a  _dir DIRECTORY.*
30fe0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68 65  *.** Removes the
30ff0 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63   specified direc
31000 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c  tory, whose full
31010 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
31020 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a   may exceed 248.
31030 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
31040 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
31050 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
31060 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
31070 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 72  E_TCLAPI win32_r
31080 6d 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c  mdir(.  void *cl
31090 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
310a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
310b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
310c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
310d0 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
310e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
310f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
31100 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
31110 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20  IRECTORY");.    
31120 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31130 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 6d  ;.  }.  if( !Rem
31140 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28 54 63  oveDirectoryW(Tc
31150 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
31160 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63  v[1])) ){.    Tc
31170 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
31180 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
31190 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
311a0 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
311b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
311c0 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
311d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
311e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
311f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
31200 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74  *      optimizat
31210 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f  ion_control DB O
31220 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a  PT BOOLEAN.**.**
31230 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
31240 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  le query optimiz
31250 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65  ations using the
31260 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
31270 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72  ntrol().** inter
31280 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20 69  face.  Disable i
31290 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c  f BOOLEAN is fal
312a0 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69 66  se and enable if
312b0 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75 65   BOOLEAN is true
312c0 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65 20  ..** OPT is the 
312d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69  name of the opti
312e0 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 64  mization to be d
312f0 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  isabled..*/.stat
31300 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
31310 4c 41 50 49 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LAPI optimizatio
31320 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69  n_control(.  voi
31330 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
31340 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
31350 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
31360 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
31370 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
31380 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
31390 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
313a0 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f  r *zOpt;.  int o
313b0 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  noff;.  int mask
313c0 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63   = 0;.  static c
313d0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
313e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
313f0 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  ptName;.    int 
31400 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d  mask;.  } aOpt[]
31410 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22   = {.    { "all"
31420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31430 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73    SQLITE_AllOpts
31440 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
31450 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20   "none",        
31460 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
31470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
31480 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c  .    { "query-fl
31490 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53 51  attener",     SQ
314a0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
314b0 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72  ner },.    { "gr
314c0 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20  oupby-order",   
314d0 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70      SQLITE_Group
314e0 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20  ByOrder   },.   
314f0 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74   { "factor-const
31500 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54 45  ants",    SQLITE
31510 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
31520 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69 6e  },.    { "distin
31530 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20 20  ct-opt",        
31540 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
31550 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  pt    },.    { "
31560 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22 2c  cover-idx-scan",
31570 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 76        SQLITE_Cov
31580 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a 20  erIdxScan   },. 
31590 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d 69     { "order-by-i
315a0 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c 49  dx-join",   SQLI
315b0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
315c0 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e  n },.    { "tran
315d0 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20 20  sitive",        
315e0 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74    SQLITE_Transit
315f0 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ive     },.    {
31600 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e   "omit-noop-join
31610 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  ",      SQLITE_O
31620 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c  mitNoopJoin   },
31630 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22 2c 20  .    { "stat3", 
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
31650 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20  LITE_Stat34     
31660 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
31670 61 74 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  at4",           
31680 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33      SQLITE_Stat3
31690 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  4         },.   
316a0 20 7b 20 22 73 6b 69 70 2d 73 63 61 6e 22 2c 20   { "skip-scan", 
316b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
316c0 5f 53 6b 69 70 53 63 61 6e 20 20 20 20 20 20 20  _SkipScan       
316d0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
316e0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
316f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
31700 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
31710 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22  "DB OPT BOOLEAN"
31720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
31730 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
31740 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
31750 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
31760 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
31770 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
31780 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
31790 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
317a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
317b0 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20  v[3], &onoff) ) 
317c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
317d0 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  ;.  zOpt = Tcl_G
317e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
317f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
31800 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
31810 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
31820 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
31830 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d  mp(zOpt, aOpt[i]
31840 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b  .zOptName)==0 ){
31850 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f  .      mask = aO
31860 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  pt[i].mask;.    
31870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
31880 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29   }.  if( onoff )
31890 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20   mask = ~mask;. 
318a0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
318b0 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
318c0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
318d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
318e0 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
318f0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f  timization - sho
31900 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c  uld be one of:",
31910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31920 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
31930 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31940 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
31950 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
31960 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
31970 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
31980 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e  p, " ", aOpt[i].
31990 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zOptName, (char*
319a0 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  )0);.    }.    r
319b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
319c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74  .  }.  sqlite3_t
319d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
319e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
319f0 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d  MIZATIONS, db, m
31a00 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ask);.  return T
31a10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
31a20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f      load_static_
31a30 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d  extension DB NAM
31a40 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64  E ....**.** Load
31a50 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74 61   one or more sta
31a60 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65  tically linked e
31a70 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  xtensions..*/.st
31a80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
31a90 54 43 4c 41 50 49 20 74 63 6c 4c 6f 61 64 53 74  TCLAPI tclLoadSt
31aa0 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64  aticExtensionCmd
31ab0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
31ac0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
31ad0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
31ae0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
31af0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
31b00 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  .){.  extern int
31b10 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
31b20 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
31b30 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
31b40 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
31b50 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
31b60 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69  sqlite3_carray_i
31b70 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
31b80 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
31b90 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
31ba0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
31bb0 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69  qlite3_closure_i
31bc0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
31bd0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
31be0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
31bf0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
31c00 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28  qlite3_csv_init(
31c10 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
31c20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
31c30 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
31c40 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31c50 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c  e3_eval_init(sql
31c60 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
31c70 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
31c80 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
31c90 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31ca0 65 78 70 6c 61 69 6e 5f 69 6e 69 74 28 73 71 6c  explain_init(sql
31cb0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
31cc0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
31cd0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
31ce0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31cf0 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69  fileio_init(sqli
31d00 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
31d10 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31d20 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
31d30 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
31d40 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  uzzer_init(sqlit
31d50 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
31d60 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
31d70 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
31d80 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65  n int sqlite3_ie
31d90 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ee_init(sqlite3*
31da0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
31db0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
31dc0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
31dd0 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63  nt sqlite3_nextc
31de0 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  har_init(sqlite3
31df0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
31e00 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
31e10 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
31e20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63  int sqlite3_perc
31e30 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69  entile_init(sqli
31e40 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
31e50 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31e60 75 74 69 6e 65 73 2a 29 3b 0a 23 69 66 6e 64 65  utines*);.#ifnde
31e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
31e80 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 78 74  RTUALTABLE.  ext
31e90 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31ea0 70 72 65 66 69 78 65 73 5f 69 6e 69 74 28 73 71  prefixes_init(sq
31eb0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
31ec0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
31ed0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 65 6e 64  routines*);.#end
31ee0 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  if.  extern int 
31ef0 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69  sqlite3_regexp_i
31f00 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
31f10 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
31f20 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
31f30 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
31f40 71 6c 69 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f  qlite3_remember_
31f50 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
31f60 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
31f70 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
31f80 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
31f90 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69  sqlite3_series_i
31fa0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
31fb0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
31fc0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
31fd0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
31fe0 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f  qlite3_spellfix_
31ff0 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
32000 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
32010 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
32020 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
32030 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69  sqlite3_totype_i
32040 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
32050 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
32060 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
32070 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
32080 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62  qlite3_wholenumb
32090 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  er_init(sqlite3*
320a0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
320b0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
320c0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
320d0 6e 74 20 73 71 6c 69 74 65 33 5f 75 6e 69 6f 6e  nt sqlite3_union
320e0 76 74 61 62 5f 69 6e 69 74 28 73 71 6c 69 74 65  vtab_init(sqlite
320f0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
32100 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
32110 69 6e 65 73 2a 29 3b 0a 23 69 66 64 65 66 20 53  ines*);.#ifdef S
32120 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
32130 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
32140 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
32150 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
32160 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
32170 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
32180 23 65 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20  #endif.  static 
32190 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
321a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
321b0 45 78 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  ExtName;.    int
321c0 20 28 2a 70 49 6e 69 74 29 28 73 71 6c 69 74 65   (*pInit)(sqlite
321d0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
321e0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
321f0 69 6e 65 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74  ines*);.  } aExt
32200 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20  ension[] = {.   
32210 20 7b 20 22 61 6d 61 74 63 68 22 2c 20 20 20 20   { "amatch",    
32220 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32230 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20  te3_amatch_init 
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32250 0a 20 20 20 20 7b 20 22 63 61 72 72 61 79 22 2c  .    { "carray",
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32270 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69  sqlite3_carray_i
32280 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
32290 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73    },.    { "clos
322a0 75 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ure",           
322b0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
322c0 75 72 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ure_init        
322d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
322e0 63 73 76 22 2c 20 20 20 20 20 20 20 20 20 20 20  csv",           
322f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32300 63 73 76 5f 69 6e 69 74 20 20 20 20 20 20 20 20  csv_init        
32310 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32320 20 7b 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20   { "eval",      
32330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32340 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 20 20 20  te3_eval_init   
32350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32360 0a 20 20 20 20 7b 20 22 65 78 70 6c 61 69 6e 22  .    { "explain"
32370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32380 73 71 6c 69 74 65 33 5f 65 78 70 6c 61 69 6e 5f  sqlite3_explain_
32390 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
323a0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65    },.    { "file
323b0 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  io",            
323c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
323d0 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  io_init         
323e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
323f0 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20 20  fuzzer",        
32400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32410 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20 20  fuzzer_init     
32420 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32430 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20 20   { "ieee754",   
32440 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32450 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20 20  te3_ieee_init   
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32470 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61 72  .    { "nextchar
32480 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32490 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
324a0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
324b0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72 63    },.    { "perc
324c0 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20 20  entile",        
324d0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72 63      sqlite3_perc
324e0 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20 20  entile_init     
324f0 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
32500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
32510 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7b 20  TUALTABLE.    { 
32520 22 70 72 65 66 69 78 65 73 22 2c 20 20 20 20 20  "prefixes",     
32530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32540 5f 70 72 65 66 69 78 65 73 5f 69 6e 69 74 20 20  _prefixes_init  
32550 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65             },.#e
32560 6e 64 69 66 0a 20 20 20 20 7b 20 22 72 65 67 65  ndif.    { "rege
32570 78 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xp",            
32580 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67 65      sqlite3_rege
32590 78 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  xp_init         
325a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
325b0 72 65 6d 65 6d 62 65 72 22 2c 20 20 20 20 20 20  remember",      
325c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
325d0 72 65 6d 65 6d 62 65 72 5f 69 6e 69 74 20 20 20  remember_init   
325e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
325f0 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20 20 20   { "series",    
32600 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32610 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74 20  te3_series_init 
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32630 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78  .    { "spellfix
32640 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32650 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78  sqlite3_spellfix
32660 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
32670 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79    },.    { "toty
32680 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
32690 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79      sqlite3_toty
326a0 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  pe_init         
326b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
326c0 75 6e 69 6f 6e 76 74 61 62 22 2c 20 20 20 20 20  unionvtab",     
326d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
326e0 75 6e 69 6f 6e 76 74 61 62 5f 69 6e 69 74 20 20  unionvtab_init  
326f0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32700 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22   { "wholenumber"
32710 2c 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,           sqli
32720 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  te3_wholenumber_
32730 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c  init          },
32740 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
32750 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 7b 20 22  AVE_ZLIB.    { "
32760 7a 69 70 66 69 6c 65 22 2c 20 20 20 20 20 20 20  zipfile",       
32770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32780 7a 69 70 66 69 6c 65 5f 69 6e 69 74 20 20 20 20  zipfile_init    
32790 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
327a0 64 69 66 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74  dif.  };.  sqlit
327b0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
327c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
327d0 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63  nt i, j, rc;.  c
327e0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
327f0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29  ;.  if( objc<3 )
32800 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
32810 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
32820 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45  , objv, "DB NAME
32830 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
32840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
32850 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
32860 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
32870 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
32880 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
32890 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
328a0 66 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b  for(j=2; j<objc;
328b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65   j++){.    zName
328c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
328d0 28 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66  (objv[j]);.    f
328e0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
328f0 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b  ize(aExtension);
32900 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
32910 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
32920 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78  Extension[i].zEx
32930 74 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  tName)==0 ) brea
32940 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
32950 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45   i>=ArraySize(aE
32960 78 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20  xtension) ){.   
32970 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
32980 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
32990 73 75 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20  such extension: 
329a0 22 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a  ", zName, (char*
329b0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
329c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
329d0 20 7d 0a 20 20 20 20 69 66 28 20 61 45 78 74 65   }.    if( aExte
329e0 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29  nsion[i].pInit )
329f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 45 78  {.      rc = aEx
32a00 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74  tension[i].pInit
32a10 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30  (db, &zErrMsg, 0
32a20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
32a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32a40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
32a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32a60 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  || zErrMsg ){.  
32a70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
32a80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
32a90 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
32aa0 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c  ", zName, " fail
32ab0 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a  ed: ", zErrMsg,.
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ad0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
32ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32af0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
32b00 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
32b10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
32b20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
32b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73  ;.}../*.**     s
32b40 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68  orter_test_fakeh
32b50 65 61 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73  eap BOOL.**.*/.s
32b60 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
32b70 5f 54 43 4c 41 50 49 20 73 6f 72 74 65 72 5f 74  _TCLAPI sorter_t
32b80 65 73 74 5f 66 61 6b 65 68 65 61 70 28 0a 20 20  est_fakeheap(.  
32b90 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
32ba0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
32bb0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
32bc0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
32bd0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
32be0 20 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 69 66    int bArg;.  if
32bf0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
32c00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
32c10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
32c20 76 2c 20 22 42 4f 4f 4c 22 29 3b 0a 20 20 20 20  v, "BOOL");.    
32c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32c40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 54 63 6c  ;.  }..  if( Tcl
32c50 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
32c60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
32c70 31 5d 2c 20 26 62 41 72 67 29 20 29 7b 0a 20 20  1], &bArg) ){.  
32c80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32c90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
32ca0 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Arg ){.    if( s
32cb0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
32cc0 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
32cd0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32ce0 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
32cf0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
32d00 54 52 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  TR(-1);.    }.  
32d10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73  }else{.    if( s
32d20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
32d30 69 67 2e 70 48 65 61 70 3d 3d 53 51 4c 49 54 45  ig.pHeap==SQLITE
32d40 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29 20  _INT_TO_PTR(-1) 
32d50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32d60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
32d70 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ap = 0;.    }.  
32d80 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  }..  Tcl_ResetRe
32d90 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
32da0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
32db0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74  ../*.**     sort
32dc0 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65  er_test_sort4_he
32dd0 6c 70 65 72 20 44 42 20 53 51 4c 31 20 4e 53 54  lper DB SQL1 NST
32de0 45 50 20 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f  EP SQL2.**.** Co
32df0 6d 70 69 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  mpile SQL statem
32e00 65 6e 74 20 24 53 51 4c 31 20 61 6e 64 20 73 74  ent $SQL1 and st
32e10 65 70 20 69 74 20 24 4e 53 54 45 50 20 74 69 6d  ep it $NSTEP tim
32e20 65 73 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77  es. For each row
32e30 2c 20 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  , .** check that
32e40 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e   the leftmost an
32e50 64 20 72 69 67 68 74 6d 6f 73 74 20 63 6f 6c 75  d rightmost colu
32e60 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  mns returned are
32e70 20 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2c 0a   both integers,.
32e80 2a 2a 20 61 6e 64 20 74 68 61 74 20 62 6f 74 68  ** and that both
32e90 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
32ea0 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
32eb0 68 65 6e 20 65 78 65 63 75 74 65 20 73 74 61 74  hen execute stat
32ec0 65 6d 65 6e 74 20 24 53 51 4c 32 2e 20 43 68 65  ement $SQL2. Che
32ed0 63 6b 20 74 68 61 74 20 74 68 65 20 73 74 61 74  ck that the stat
32ee0 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68  ement returns th
32ef0 65 20 73 61 6d 65 0a 2a 2a 20 73 65 74 20 6f 66  e same.** set of
32f00 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65   integers in the
32f10 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 69   same order as i
32f20 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
32f30 74 65 70 20 28 75 73 69 6e 67 20 24 53 51 4c 31  tep (using $SQL1
32f40 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
32f50 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
32f60 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34  orter_test_sort4
32f70 5f 68 65 6c 70 65 72 28 0a 20 20 76 6f 69 64 20  _helper(.  void 
32f80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
32f90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
32fa0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
32fb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
32fc0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
32fd0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a  st char *zSql1;.
32fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
32ff0 71 6c 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70  ql2;.  int nStep
33000 3b 20 0a 20 20 69 6e 74 20 69 53 74 65 70 3b 20  ; .  int iStep; 
33010 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
33020 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20  iCksum1 = 0; .  
33030 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b  unsigned int iCk
33040 73 75 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74  sum2 = 0; .  int
33050 20 72 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20   rc;.  int iB;. 
33060 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
33070 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
33080 74 6d 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  tmt;.  .  if( ob
33090 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
330a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
330b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
330c0 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51  DB SQL1 NSTEP SQ
330d0 4c 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  L2");.    return
330e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
330f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
33100 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
33110 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
33120 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
33130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
33140 53 71 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53 74  Sql1 = Tcl_GetSt
33150 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
33160 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
33170 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
33180 62 6a 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20  bjv[3], &nStep) 
33190 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
331a0 4f 52 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63  OR;.  zSql2 = Tc
331b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
331c0 5b 34 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [4]);..  rc = sq
331d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
331e0 28 64 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20  (db, zSql1, -1, 
331f0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
33200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33210 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72  ) goto sql_error
33220 3b 0a 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65  ;..  iB = sqlite
33230 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
33240 53 74 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69  Stmt)-1;.  for(i
33250 53 74 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53  Step=0; iStep<nS
33260 74 65 70 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  tep && SQLITE_RO
33270 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
33280 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29  pStmt); iStep++)
33290 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71  {.    int a = sq
332a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
332b0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
332c0 69 66 28 20 61 21 3d 73 71 6c 69 74 65 33 5f 63  if( a!=sqlite3_c
332d0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
332e0 20 69 42 29 20 29 7b 0a 20 20 20 20 20 20 54 63   iB) ){.      Tc
332f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
33300 6e 74 65 72 70 2c 20 22 64 61 74 61 20 65 72 72  nterp, "data err
33310 6f 72 3a 20 28 61 21 3d 62 29 22 2c 20 30 29 3b  or: (a!=b)", 0);
33320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
33330 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
33340 20 20 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28      iCksum1 += (
33350 69 43 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20  iCksum1 << 3) + 
33360 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61 3b  (unsigned int)a;
33370 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
33380 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33390 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  mt);.  if( rc!=S
333a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
333b0 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63  sql_error;..  rc
333c0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
333d0 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c  re_v2(db, zSql2,
333e0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
333f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33400 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
33410 65 72 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74  error;.  for(iSt
33420 65 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57  ep=0; SQLITE_ROW
33430 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
33440 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b  Stmt); iStep++){
33450 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c  .    int a = sql
33460 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
33470 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
33480 43 6b 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75  Cksum2 += (iCksu
33490 6d 32 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69  m2 << 3) + (unsi
334a0 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a  gned int)a;.  }.
334b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
334c0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
334d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
334e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65  _OK ) goto sql_e
334f0 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b  rror;..  if( iCk
33500 73 75 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b  sum1!=iCksum2 ){
33510 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
33520 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
33530 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68  hecksum mismatch
33540 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
33550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
33560 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
33570 4b 3b 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20  K;. sql_error:. 
33580 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
33590 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65  t(interp, "sql e
335a0 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
335b0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
335c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
335d0 52 4f 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ROR;.}...#ifdef 
335e0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
335f0 45 4e 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c  ENTICATION.#incl
33600 75 64 65 20 22 73 71 6c 69 74 65 33 75 73 65 72  ude "sqlite3user
33610 61 75 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63  auth.h"./*.** tc
33620 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
33630 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65  ser_authenticate
33640 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
33650 53 57 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20  SWORD.*/.static 
33660 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
33670 49 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68  I test_user_auth
33680 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65  enticate(.  Clie
33690 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
336a0 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
336b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
336c0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
336d0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
336e0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
336f0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
33700 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
33710 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
33720 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
33730 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
33740 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
33750 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
33760 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
33770 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
33780 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
33790 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
337a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
337b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
337c0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
337d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
337e0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
337f0 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
33800 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74  SWORD");.    ret
33810 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
33820 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
33830 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
33840 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
33850 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
33860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
33870 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
33880 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
33890 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
338a0 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
338b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
338c0 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
338d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
338e0 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
338f0 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
33900 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20  wd, nPasswd);.  
33910 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
33920 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
33930 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
33940 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
33950 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
33960 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
33970 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
33980 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
33990 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
339a0 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
339b0 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
339c0 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55 53 45  _user_add DB USE
339d0 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
339e0 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
339f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
33a00 50 49 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64  PI test_user_add
33a10 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
33a20 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
33a30 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
33a40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
33a50 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
33a60 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
33a70 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
33a80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
33a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33aa0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
33ab0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
33ac0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
33ad0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
33ae0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
33af0 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20  ar *zUser = 0;. 
33b00 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d   char *zPasswd =
33b10 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77   0;.  int nPassw
33b20 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41  d = 0;.  int isA
33b30 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dmin = 0;.  sqli
33b40 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
33b50 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
33b60 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
33b70 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
33b80 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55  , 1, objv, "DB U
33b90 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
33ba0 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20   ISADMIN");.    
33bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
33bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
33bd0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
33be0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
33bf0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
33c00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
33c10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
33c20 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
33c30 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
33c40 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74  Passwd = Tcl_Get
33c50 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
33c60 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29  jv[3], &nPasswd)
33c70 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  ;.  Tcl_GetBoole
33c80 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
33c90 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64  , objv[4], &isAd
33ca0 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  min);.  rc = sql
33cb0 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 64 62  ite3_user_add(db
33cc0 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64  , zUser, zPasswd
33cd0 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d  , nPasswd, isAdm
33ce0 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  in);.  Tcl_SetRe
33cf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
33d00 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
33d10 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
33d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
33d30 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
33d40 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
33d50 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23  ENTICATION */..#
33d60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
33d70 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
33d80 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
33d90 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
33da0 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20  nge DB USERNAME 
33db0 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
33dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
33dd0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
33de0 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 0a 20  t_user_change(. 
33df0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
33e00 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
33e10 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
33e20 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33e30 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e40 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33e50 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
33e60 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
33e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
33e80 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
33e90 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
33ea0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
33eb0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
33ec0 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
33ed0 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68  *zUser = 0;.  ch
33ee0 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b  ar *zPasswd = 0;
33ef0 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d  .  int nPasswd =
33f00 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69   0;.  int isAdmi
33f10 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  n = 0;.  sqlite3
33f20 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
33f30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
33f40 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
33f50 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
33f60 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52  , objv, "DB USER
33f70 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
33f80 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74  ADMIN");.    ret
33f90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
33fa0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
33fb0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
33fc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
33fd0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
33fe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
33ff0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
34000 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
34010 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
34020 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
34030 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
34040 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
34050 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
34060 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
34070 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e  bjv[4], &isAdmin
34080 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
34090 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 64 62  3_user_change(db
340a0 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64  , zUser, zPasswd
340b0 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d  , nPasswd, isAdm
340c0 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  in);.  Tcl_SetRe
340d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
340e0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
340f0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
34100 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
34110 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
34120 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
34130 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23  ENTICATION */..#
34140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
34150 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
34160 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
34170 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c  sqlite3_user_del
34180 65 74 65 20 44 42 20 55 53 45 52 4e 41 4d 45 0a  ete DB USERNAME.
34190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
341a0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
341b0 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 0a 20 20  _user_delete(.  
341c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
341d0 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
341e0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
341f0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
34200 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
34210 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
34220 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
34230 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
34240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34250 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
34260 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
34270 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
34280 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
34290 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
342a0 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  zUser = 0;.  sql
342b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
342c0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
342d0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
342e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
342f0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
34300 55 53 45 52 4e 41 4d 45 22 29 3b 0a 20 20 20 20  USERNAME");.    
34310 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
34320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
34330 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
34340 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
34350 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
34360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
34370 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
34380 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
34390 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72  ng(objv[2]);.  r
343a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
343b0 5f 64 65 6c 65 74 65 28 64 62 2c 20 7a 55 73 65  _delete(db, zUse
343c0 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  r);.  Tcl_SetRes
343d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
343e0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
343f0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
34400 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
34410 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
34420 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
34430 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  NTICATION */../*
34440 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 62 61 64 5f  .** tclcmd: bad_
34450 62 65 68 61 76 69 6f 72 20 54 59 50 45 0a 2a 2a  behavior TYPE.**
34460 0a 2a 2a 20 44 6f 20 73 6f 6d 65 20 74 68 69 6e  .** Do some thin
34470 67 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 74  gs that should t
34480 72 69 67 67 65 72 20 61 20 76 61 6c 67 72 69 6e  rigger a valgrin
34490 64 20 6f 72 20 2d 66 73 61 6e 69 74 69 7a 65 3d  d or -fsanitize=
344a0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 77 61 72  undefined.** war
344b0 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75  ning.  This is u
344c0 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  sed to verify th
344d0 61 74 20 65 72 72 6f 72 73 20 61 6e 64 20 77 61  at errors and wa
344e0 72 6e 69 6e 67 73 20 6f 75 74 70 75 74 20 62 79  rnings output by
344f0 20 74 68 6f 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20   those.** tools 
34500 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
34510 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
34520 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 59  ..**.**       TY
34530 50 45 20 20 20 20 20 20 20 42 45 48 41 56 49 4f  PE       BEHAVIO
34540 52 0a 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20  R.**       1    
34550 20 20 20 20 20 20 4f 76 65 72 66 6c 6f 77 20 61        Overflow a
34560 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
34570 2a 2a 20 20 20 20 20 20 20 32 20 20 20 20 20 20  **       2      
34580 20 20 20 20 4a 75 6d 70 20 62 61 73 65 64 20 6f      Jump based o
34590 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
345a0 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ed variable.**  
345b0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
345c0 52 65 61 64 20 61 66 74 65 72 20 66 72 65 65 0a  Read after free.
345d0 2a 2a 20 20 20 20 20 20 20 34 20 20 20 20 20 20  **       4      
345e0 20 20 20 20 50 61 6e 69 63 0a 2a 2f 0a 73 74 61      Panic.*/.sta
345f0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
34600 43 4c 41 50 49 20 74 65 73 74 5f 62 61 64 5f 62  CLAPI test_bad_b
34610 65 68 61 76 69 6f 72 28 0a 20 20 43 6c 69 65 6e  ehavior(.  Clien
34620 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
34630 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
34640 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 74 61  an integer conta
34650 69 6e 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ining zero */.  
34660 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34670 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
34680 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
34690 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
346a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
346b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
346c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
346d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
346e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
346f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
34700 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
34710 7b 0a 20 20 69 6e 74 20 69 54 79 70 65 3b 0a 20  {.  int iType;. 
34720 20 69 6e 74 20 78 79 7a 3b 0a 20 20 69 6e 74 20   int xyz;.  int 
34730 69 20 3d 20 2a 28 69 6e 74 2a 29 63 6c 69 65 6e  i = *(int*)clien
34740 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a  tData;.  int j;.
34750 20 20 69 6e 74 20 77 5b 31 30 5d 3b 0a 20 20 69    int w[10];.  i
34760 6e 74 20 2a 61 3b 0a 20 20 69 66 28 20 6f 62 6a  nt *a;.  if( obj
34770 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
34780 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
34790 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54  erp, 1, objv, "T
347a0 59 50 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  YPE");.    retur
347b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
347c0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
347d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
347e0 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 54 79 70 65   objv[1], &iType
347f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
34800 52 52 4f 52 3b 0a 20 20 73 77 69 74 63 68 28 20  RROR;.  switch( 
34810 69 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  iType ){.    cas
34820 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 78 79 7a  e 1: {.      xyz
34830 20 3d 20 30 78 37 66 66 66 66 66 30 30 20 2d 20   = 0x7fffff00 - 
34840 69 3b 0a 20 20 20 20 20 20 78 79 7a 20 2b 3d 20  i;.      xyz += 
34850 30 78 31 30 30 3b 0a 20 20 20 20 20 20 54 63 6c  0x100;.      Tcl
34860 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
34870 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
34880 4f 62 6a 28 78 79 7a 29 29 3b 0a 20 20 20 20 20  Obj(xyz));.     
34890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
348a0 20 20 63 61 73 65 20 32 3a 20 7b 0a 20 20 20 20    case 2: {.    
348b0 20 20 77 5b 31 5d 20 3d 20 35 3b 0a 20 20 20 20    w[1] = 5;.    
348c0 20 20 69 66 28 20 77 5b 69 5d 3e 30 20 29 20 77    if( w[i]>0 ) w
348d0 5b 31 5d 2b 2b 3b 0a 20 20 20 20 20 20 54 63 6c  [1]++;.      Tcl
348e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
348f0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
34900 4f 62 6a 28 77 5b 31 5d 29 29 3b 0a 20 20 20 20  Obj(w[1]));.    
34910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
34920 20 20 20 63 61 73 65 20 33 3a 20 7b 0a 20 20 20     case 3: {.   
34930 20 20 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 73     a = malloc( s
34940 69 7a 65 6f 66 28 69 6e 74 29 2a 31 30 20 29 3b  izeof(int)*10 );
34950 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
34960 6a 3c 31 30 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20  j<10; j++) a[j] 
34970 3d 20 6a 3b 0a 20 20 20 20 20 20 66 72 65 65 28  = j;.      free(
34980 61 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  a);.      Tcl_Se
34990 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
349a0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
349b0 28 61 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 62  (a[i]));.      b
349c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
349d0 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
349e0 54 63 6c 5f 50 61 6e 69 63 28 22 44 65 6c 69 62  Tcl_Panic("Delib
349f0 65 72 61 74 65 20 70 61 6e 69 63 22 29 3b 0a 20  erate panic");. 
34a00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  }.  }.  return T
34a20 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a  CL_OK;.}  ../*.*
34a30 2a 20 74 63 6c 63 6d 64 3a 20 20 20 72 65 67 69  * tclcmd:   regi
34a40 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
34a50 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20   DB.**.** Cause 
34a60 74 68 65 20 64 62 73 74 61 74 20 76 69 72 74 75  the dbstat virtu
34a70 61 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  al table to be a
34a80 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
34a90 63 6f 6e 6e 65 63 74 69 6f 6e 20 44 42 0a 2a 2f  connection DB.*/
34aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
34ab0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
34ac0 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76  egister_dbstat_v
34ad0 74 61 62 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  tab(.  void *cli
34ae0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
34af0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
34b00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
34b10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
34b20 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  [].){.#ifdef SQL
34b30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
34b40 54 41 42 4c 45 0a 20 20 54 63 6c 5f 41 70 70 65  TABLE.  Tcl_Appe
34b50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
34b60 20 22 64 62 73 74 61 74 20 6e 6f 74 20 61 76 61   "dbstat not ava
34b70 69 6c 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f  ilable because o
34b80 66 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  f ".            
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
34ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
34bb0 55 41 4c 54 41 42 4c 45 22 2c 20 28 76 6f 69 64  UALTABLE", (void
34bc0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
34bd0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
34be0 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44    struct SqliteD
34bf0 62 20 7b 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  b { sqlite3 *db;
34c00 20 7d 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   };.  char *zDb;
34c10 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
34c20 6d 64 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 6f  mdInfo;..  if( o
34c30 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
34c40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
34c50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
34c60 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
34c70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
34c80 0a 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  ..  zDb = Tcl_Ge
34c90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
34ca0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43  ;.  if( Tcl_GetC
34cb0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
34cc0 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f  p, zDb, &cmdInfo
34cd0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
34ce0 2a 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20  * db = ((struct 
34cf0 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
34d00 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
34d10 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->db;.    sqlite
34d20 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28  3DbstatRegister(
34d30 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
34d40 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66  n TCL_OK;.#endif
34d50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
34d60 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
34d70 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
34d80 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
34d90 6e 66 69 67 20 44 42 20 53 45 54 54 49 4e 47 20  nfig DB SETTING 
34da0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  VALUE.**.** Invo
34db0 6b 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  ke sqlite3_db_co
34dc0 6e 66 69 67 28 29 20 66 6f 72 20 6f 6e 65 20 6f  nfig() for one o
34dd0 66 20 74 68 65 20 73 65 74 74 69 6e 67 20 76 61  f the setting va
34de0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
34df0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
34e00 49 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64  I test_sqlite3_d
34e10 62 5f 63 6f 6e 66 69 67 28 0a 20 20 76 6f 69 64  b_config(.  void
34e20 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
34e30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34e40 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34e50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34e60 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61   objv[].){.  sta
34e70 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
34e80 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
34e90 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
34ea0 74 20 65 56 61 6c 3b 0a 20 20 7d 20 61 53 65 74  t eVal;.  } aSet
34eb0 74 69 6e 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ting[] = {.    {
34ec0 20 22 46 4b 45 59 22 2c 20 20 20 20 20 20 20 20   "FKEY",        
34ed0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
34ee0 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20  FIG_ENABLE_FKEY 
34ef0 7d 2c 0a 20 20 20 20 7b 20 22 54 52 49 47 47 45  },.    { "TRIGGE
34f00 52 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  R",         SQLI
34f10 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
34f20 4c 45 5f 54 52 49 47 47 45 52 20 7d 2c 0a 20 20  LE_TRIGGER },.  
34f30 20 20 7b 20 22 46 54 53 33 5f 54 4f 4b 45 4e 49    { "FTS3_TOKENI
34f40 5a 45 52 22 2c 20 20 53 51 4c 49 54 45 5f 44 42  ZER",  SQLITE_DB
34f50 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54  CONFIG_ENABLE_FT
34f60 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a  S3_TOKENIZER },.
34f70 20 20 20 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45      { "LOAD_EXTE
34f80 4e 53 49 4f 4e 22 2c 20 20 53 51 4c 49 54 45 5f  NSION",  SQLITE_
34f90 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
34fa0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d  LOAD_EXTENSION }
34fb0 2c 0a 20 20 20 20 7b 20 22 4e 4f 5f 43 4b 50 54  ,.    { "NO_CKPT
34fc0 5f 4f 4e 5f 43 4c 4f 53 45 22 2c 53 51 4c 49 54  _ON_CLOSE",SQLIT
34fd0 45 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b  E_DBCONFIG_NO_CK
34fe0 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20 7d 2c 0a 20  PT_ON_CLOSE },. 
34ff0 20 20 20 7b 20 22 51 50 53 47 22 2c 20 20 20 20     { "QPSG",    
35000 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
35010 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51  BCONFIG_ENABLE_Q
35020 50 53 47 20 7d 2c 0a 20 20 20 20 7b 20 22 54 52  PSG },.    { "TR
35030 49 47 47 45 52 5f 45 51 50 22 2c 20 20 20 20 20  IGGER_EQP",     
35040 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
35050 54 52 49 47 47 45 52 5f 45 51 50 20 7d 2c 0a 20  TRIGGER_EQP },. 
35060 20 20 20 7b 20 22 52 45 53 45 54 5f 44 42 22 2c     { "RESET_DB",
35070 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
35080 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41  BCONFIG_RESET_DA
35090 54 41 42 41 53 45 20 7d 2c 0a 20 20 20 20 7b 20  TABASE },.    { 
350a0 22 44 45 46 45 4e 53 49 56 45 22 2c 20 20 20 20  "DEFENSIVE",    
350b0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
350c0 49 47 5f 44 45 46 45 4e 53 49 56 45 20 7d 2c 0a  IG_DEFENSIVE },.
350d0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
350e0 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63  int v;.  const c
350f0 68 61 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20  har *zSetting;. 
35100 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
35110 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
35120 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
35130 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
35140 6f 62 6a 76 2c 20 22 44 42 20 53 45 54 54 49 4e  objv, "DB SETTIN
35150 47 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72  G VALUE");.    r
35160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
35170 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
35180 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
35190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
351a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
351b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
351c0 0a 20 20 7a 53 65 74 74 69 6e 67 20 3d 20 54 63  .  zSetting = Tc
351d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
351e0 5b 32 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  [2]);.  if( sqli
351f0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c  te3_strglob("SQL
35200 49 54 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  ITE_*", zSetting
35210 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
35220 2b 3d 20 37 3b 0a 20 20 69 66 28 20 73 71 6c 69  += 7;.  if( sqli
35230 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 44 42 43  te3_strglob("DBC
35240 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69  ONFIG_*", zSetti
35250 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e  ng)==0 ) zSettin
35260 67 20 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73 71  g += 9;.  if( sq
35270 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 45  lite3_strglob("E
35280 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69  NABLE_*", zSetti
35290 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e  ng)==0 ) zSettin
352a0 67 20 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d  g += 7;.  for(i=
352b0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
352c0 53 65 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a  Setting); i++){.
352d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
352e0 53 65 74 74 69 6e 67 2c 20 61 53 65 74 74 69 6e  Setting, aSettin
352f0 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  g[i].zName)==0 )
35300 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
35310 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61  ( i>=ArraySize(a
35320 53 65 74 74 69 6e 67 29 20 29 7b 0a 20 20 20 20  Setting) ){.    
35330 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
35340 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 54  (interp,.      T
35350 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
35360 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33  "unknown sqlite3
35370 5f 64 62 5f 63 6f 6e 66 69 67 20 73 65 74 74 69  _db_config setti
35380 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72  ng", -1));.    r
35390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
353a0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
353b0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
353c0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
353d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
353e0 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
353f0 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61 53  db_config(db, aS
35400 65 74 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20  etting[i].eVal, 
35410 76 2c 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65  v, &v);.  Tcl_Se
35420 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
35430 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
35440 28 76 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (v));.  return T
35450 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
35460 43 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  Change the name 
35470 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
35480 62 61 73 65 20 73 63 68 65 6d 61 20 66 72 6f 6d  base schema from
35490 20 22 6d 61 69 6e 22 20 74 6f 20 22 69 63 65 63   "main" to "icec
354a0 75 62 65 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ube"..*/.static 
354b0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
354c0 49 20 74 65 73 74 5f 64 62 63 6f 6e 66 69 67 5f  I test_dbconfig_
354d0 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75  maindbname_icecu
354e0 62 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  be(.  void * cli
354f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
35500 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
35510 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
35520 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
35530 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
35540 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
35550 20 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44   extern int getD
35560 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
35570 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  erp*, const char
35580 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20  *, sqlite3**);. 
35590 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
355a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
355b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
355c0 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
355d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
355e0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
355f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
35600 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
35610 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
35620 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
35630 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63  CL_ERROR;.    rc
35640 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f   = sqlite3_db_co
35650 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
35660 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e  DBCONFIG_MAINDBN
35670 41 4d 45 2c 20 22 69 63 65 63 75 62 65 22 29 3b  AME, "icecube");
35680 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
35690 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
356a0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
356b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
356c0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
356d0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
356e0 5f 6d 6d 61 70 5f 77 61 72 6d 20 44 42 20 44 42  _mmap_warm DB DB
356f0 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
35700 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
35710 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72 6d 28   test_mmap_warm(
35720 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
35730 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
35740 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
35750 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
35760 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
35770 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
35780 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
35790 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20  _Interp*, const 
357a0 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a  char*, sqlite3**
357b0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
357c0 73 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72  sqlite3_mmap_war
357d0 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  m(sqlite3 *db, c
357e0 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 20  onst char *);.. 
357f0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
35800 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
35810 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
35820 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
35830 20 22 44 42 20 3f 44 42 4e 41 4d 45 3f 22 29 3b   "DB ?DBNAME?");
35840 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
35850 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
35860 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
35870 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
35880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
35890 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 67 65   = 0;.    if( ge
358a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
358b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
358c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
358d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
358e0 4f 52 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  OR;.    if( objc
358f0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ==3 ){.      zDb
35900 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
35910 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
35920 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35930 33 5f 6d 6d 61 70 5f 77 61 72 6d 28 64 62 2c 20  3_mmap_warm(db, 
35940 7a 44 62 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  zDb);.    Tcl_Se
35950 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
35960 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
35970 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
35980 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
35990 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
359a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
359b0 61 67 65 3a 20 20 64 65 63 6f 64 65 5f 68 65 78  age:  decode_hex
359c0 64 62 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 45 78  db TEXT.**.** Ex
359d0 61 6d 70 6c 65 3a 20 20 20 64 62 20 64 65 73 65  ample:   db dese
359e0 72 69 61 6c 69 7a 65 20 5b 64 65 63 6f 64 65 5f  rialize [decode_
359f0 68 65 78 64 62 20 24 6f 75 74 70 75 74 5f 6f 66  hexdb $output_of
35a00 5f 64 62 74 6f 74 78 74 5d 0a 2a 2a 0a 2a 2a 20  _dbtotxt].**.** 
35a10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
35a20 75 72 6e 73 20 61 20 62 79 74 65 2d 61 72 72 61  urns a byte-arra
35a30 79 20 66 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  y for an SQLite 
35a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
35a50 61 74 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 72 75  at.** is constru
35a60 63 74 65 64 20 66 72 6f 6d 20 61 20 74 65 78 74  cted from a text
35a70 20 69 6e 70 75 74 20 77 68 69 63 68 20 69 73 20   input which is 
35a80 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
35a90 65 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 75  e "dbtotxt".** u
35aa0 74 69 6c 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69  tility..*/.stati
35ab0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
35ac0 41 50 49 20 74 65 73 74 5f 64 65 63 6f 64 65 5f  API test_decode_
35ad0 68 65 78 64 62 28 0a 20 20 76 6f 69 64 20 2a 20  hexdb(.  void * 
35ae0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
35af0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
35b00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
35b10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
35b20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
35b30 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 30 3b 0a   char *zIn = 0;.
35b40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35b50 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *a = 0;.  int n 
35b60 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  = 0;.  int linen
35b70 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  o = 0;.  int i, 
35b80 69 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 4f 66  iNext;.  int iOf
35b90 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  fset = 0;.  int 
35ba0 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  j, k;.  int rc;.
35bb0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
35bc0 5b 31 36 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63  [16];.  if( objc
35bd0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
35be0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
35bf0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 48 45  rp, 1, objv, "HE
35c00 58 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  XDB");.    retur
35c10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
35c20 0a 20 20 7a 49 6e 20 3d 20 54 63 6c 5f 47 65 74  .  zIn = Tcl_Get
35c30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
35c40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b  .  for(i=0; zIn[
35c50 69 5d 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20 20  i]; i=iNext){.  
35c60 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
35c70 66 6f 72 28 69 4e 65 78 74 3d 69 3b 20 7a 49 6e  for(iNext=i; zIn
35c80 5b 69 4e 65 78 74 5d 20 26 26 20 7a 49 6e 5b 69  [iNext] && zIn[i
35c90 4e 65 78 74 5d 21 3d 27 5c 6e 27 3b 20 69 4e 65  Next]!='\n'; iNe
35ca0 78 74 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20  xt++){}.    if( 
35cb0 7a 49 6e 5b 69 4e 65 78 74 5d 3d 3d 27 5c 6e 27  zIn[iNext]=='\n'
35cc0 20 29 20 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20   ) iNext++;.    
35cd0 77 68 69 6c 65 28 20 7a 49 6e 5b 69 5d 3d 3d 27  while( zIn[i]=='
35ce0 20 27 20 7c 7c 20 7a 49 6e 5b 69 5d 3d 3d 27 5c   ' || zIn[i]=='\
35cf0 74 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  t' ){ i++; }.   
35d00 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
35d10 20 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 20     int pgsz;.   
35d20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a     rc = sscanf(z
35d30 49 6e 2b 69 2c 20 22 7c 20 73 69 7a 65 20 25 64  In+i, "| size %d
35d40 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20 26   pagesize %d", &
35d50 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 20 20 20  n, &pgsz);.     
35d60 20 69 66 28 20 72 63 21 3d 32 20 29 20 63 6f 6e   if( rc!=2 ) con
35d70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
35d80 20 6e 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20   n<512 ){.      
35d90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
35da0 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
35db0 27 73 69 7a 65 27 20 66 69 65 6c 64 22 2c 20 28  'size' field", (
35dc0 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20  void*)0);.      
35dd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
35de0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
35df0 20 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20    a = malloc( n 
35e00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 3d 3d  );.      if( a==
35e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  0 ){.        Tcl
35e20 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
35e30 74 65 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d 65  terp, "out of me
35e40 6d 6f 72 79 22 2c 20 28 76 6f 69 64 2a 29 30 29  mory", (void*)0)
35e50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
35e60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
35e70 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
35e80 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 20  (a, 0, n);.     
35e90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
35ea0 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66  .    rc = sscanf
35eb0 28 7a 49 6e 2b 69 2c 20 22 7c 20 70 61 67 65 20  (zIn+i, "| page 
35ec0 25 64 20 6f 66 66 73 65 74 20 25 64 22 2c 20 26  %d offset %d", &
35ed0 6a 2c 20 26 6b 29 3b 0a 20 20 20 20 69 66 28 20  j, &k);.    if( 
35ee0 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rc==2 ){.      i
35ef0 4f 66 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20  Offset = k;.    
35f00 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
35f10 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e  }.    rc = sscan
35f20 66 28 7a 49 6e 2b 69 2c 22 7c 20 25 64 3a 20 25  f(zIn+i,"| %d: %
35f30 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
35f40 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
35f50 25 78 20 25 78 20 25 78 20 25 78 20 25 78 22 2c  %x %x %x %x %x",
35f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35f70 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b 31   &j, &x[0], &x[1
35f80 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d 2c  ], &x[2], &x[3],
35f90 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20 26   &x[4], &x[5], &
35fa0 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20 20  x[6], &x[7],.   
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78 5b               &x[
35fc0 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31 30  8], &x[9], &x[10
35fd0 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31 32  ], &x[11], &x[12
35fe0 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31 34  ], &x[13], &x[14
35ff0 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20 20  ], &x[15]);.    
36000 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20 20  if( rc==17 ){.  
36010 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74 2b      k = iOffset+
36020 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b 31  j;.      if( k+1
36030 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  6<=n ){.        
36040 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
36050 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36 3b  for(ii=0; ii<16;
36060 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20 3d   ii++) a[k+ii] =
36070 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20 20   x[ii]&0xff;.   
36080 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
36090 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nue;.    }.  }. 
360a0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
360b0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
360c0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 61 2c  wByteArrayObj(a,
360d0 20 6e 29 29 3b 0a 20 20 66 72 65 65 28 61 29 3b   n));.  free(a);
360e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
360f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ;.}.../*.** Regi
36100 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
36110 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
36120 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
36130 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
36140 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
36150 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  rp){.  extern in
36160 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
36170 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
36180 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75   int sqlite3_fou
36190 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  nd_count;.  exte
361a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
361b0 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
361c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
361d0 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
361e0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
361f0 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
36200 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
36210 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
36220 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51  ent_time;.#if SQ
36230 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
36240 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
36250 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
36260 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
36270 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  E.  extern int s
36280 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
36290 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65  m;.#endif.  exte
362a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
362b0 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
362c0 78 74 65 72 6e 20 69 6e 74 20 53 51 4c 49 54 45  xtern int SQLITE
362d0 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 42  _TCLAPI sqlite3B
362e0 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
362f0 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20  eport(void*,.   
36300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36320 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72         Tcl_Inter
36330 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43  p*,int,Tcl_Obj*C
36340 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63  ONST*);.  static
36350 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20 30 3b 0a   int iZero = 0;.
36360 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
36370 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
36380 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64  me;.     Tcl_Cmd
36390 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
363a0 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20   aCmd[] = {.    
363b0 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20   { "db_enter",  
363c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363d0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
363e0 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20 20 20  *)db_enter      
363f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36400 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c 20 20   { "db_leave",  
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36420 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36430 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20 20 20  *)db_leave      
36440 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36450 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36460 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ntf_int",       
36470 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36480 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
36490 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20  f_int    },.    
364a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
364b0 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ntf_int64",     
364c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
364d0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
364e0 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20  f_int64  },.    
364f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36500 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20  ntf_long",      
36510 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36520 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
36530 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20  f_long   },.    
36540 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36550 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20  ntf_str",       
36560 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36570 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
36580 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20 20 20  f_str    },.    
36590 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
365a0 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20  intf_str",      
365b0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
365c0 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  *)sqlite3_snprin
365d0 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20 20  tf_str   },.    
365e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
365f0 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20  ntf_stronly",   
36600 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36610 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
36620 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20  f_stronly},.    
36630 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36640 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ntf_double",    
36650 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36660 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
36670 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20  f_double },.    
36680 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36690 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20 20 20  ntf_scaled",    
366a0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
366b0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
366c0 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20  f_scaled },.    
366d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
366e0 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20  ntf_hexdouble", 
366f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36700 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36710 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20  hexdouble},.    
36720 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
36730 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20  ntf_z_test",    
36740 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36750 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  *)test_mprintf_z
36760 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36770 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  { "sqlite3_mprin
36780 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20 20  tf_n_test",     
36790 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
367a0 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20  )test_mprintf_n 
367b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
367c0 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   "sqlite3_snprin
367d0 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  tf_int",        
367e0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
367f0 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  test_snprintf_in
36800 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t     },.     { 
36810 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e  "sqlite3_last_in
36820 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20  sert_rowid",    
36830 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
36840 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20  est_last_rowid  
36850 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
36860 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
36870 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ntf",           
36880 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
36890 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20  st_exec_printf  
368a0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
368b0 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 22  qlite3_exec_hex"
368c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
368d0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
368e0 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20 20 20  t_exec_hex      
368f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
36900 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20 20 20  lite3_exec",    
36910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
36920 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
36930 5f 65 78 65 63 20 20 20 20 20 20 20 20 20 20 20  _exec           
36940 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36950 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20  ite3_exec_nr",  
36960 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
36970 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
36980 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20 20 20  exec_nr         
36990 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
369a0 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c  TE_OMIT_GET_TABL
369b0 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
369c0 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  3_get_table_prin
369d0 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  tf",      (Tcl_C
369e0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74  mdProc*)test_get
369f0 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c  _table_printf },
36a00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
36a10 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20  sqlite3_close", 
36a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a30 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
36a40 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20  lite_test_close 
36a50 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
36a60 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 22  qlite3_close_v2"
36a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
36a80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
36a90 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76  ite_test_close_v
36aa0 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  2  },.     { "sq
36ab0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
36ac0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ction",       (T
36ad0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
36ae0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
36af0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36b00 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
36b10 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54 63  egate",      (Tc
36b20 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
36b30 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
36b40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36b50 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
36b60 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c  _function", (Tcl
36b70 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
36b80 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20  egister_func    
36b90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36ba0 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20  e_abort",       
36bb0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
36bc0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
36bd0 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d  abort          }
36be0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36bf0 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
36c00 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
36c10 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
36c20 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
36c30 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
36c40 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
36c50 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
36c60 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
36c70 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
36c80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36c90 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
36ca0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
36cb0 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
36cc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
36cd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
36ce0 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
36cf0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
36d00 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
36d10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
36d20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
36d30 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
36d40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
36d50 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
36d60 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20  agic      },.   
36d70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74    { "sqlite3_int
36d80 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
36d90 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
36da0 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70  c*)test_interrup
36db0 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
36dc0 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
36dd0 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
36de0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36df0 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  *)delete_functio
36e00 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  n       },.     
36e10 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  { "sqlite_delete
36e20 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20  _collation",    
36e30 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
36e40 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  )delete_collatio
36e50 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  n      },.     {
36e60 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   "sqlite3_get_au
36e70 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  tocommit",      
36e80 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36e90 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20  get_autocommit  
36ea0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
36eb0 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69  "sqlite3_busy_ti
36ec0 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20  meout",         
36ed0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
36ee0 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
36ef0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
36f00 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
36f30 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20  st_printf       
36f40 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
36f50 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20  qlite3IoTrace", 
36f60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
36f70 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
36f80 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20 20  io_trace        
36f90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c 61 6e   },.     { "clan
36fa0 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
36fb0 73 73 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ss",        (Tcl
36fc0 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e 67 5f  _CmdProc*)clang_
36fd0 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
36fe0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69   },.  };.  stati
36ff0 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
37000 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
37010 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63    Tcl_ObjCmdProc
37020 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f   *xProc;.     vo
37030 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id *clientData;.
37040 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20    } aObjCmd[] = 
37050 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
37060 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c 20 20 20  3_db_config",   
37070 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
37080 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
37090 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62  , 0 },.     { "b
370a0 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20 20 20  ad_behavior",   
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
370c0 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72  est_bad_behavior
370d0 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65 72 6f  ,  (void*)&iZero
370e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 67 69   },.     { "regi
370f0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
37100 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
37110 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74  _register_dbstat
37120 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20 20 7b  _vtab  },.     {
37130 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   "sqlite3_connec
37140 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20  tion_pointer",  
37150 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69    get_sqlite_poi
37160 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  nter, 0 },.     
37170 7b 20 22 69 6e 74 61 72 72 61 79 5f 61 64 64 72  { "intarray_addr
37180 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37190 20 20 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79     test_intarray
371a0 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20  _addr, 0 },.    
371b0 20 7b 20 22 69 6e 74 36 34 61 72 72 61 79 5f 61   { "int64array_a
371c0 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ddr",           
371d0 20 20 20 20 74 65 73 74 5f 69 6e 74 36 34 61 72      test_int64ar
371e0 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20  ray_addr, 0 },. 
371f0 20 20 20 20 7b 20 22 64 6f 75 62 6c 65 61 72 72      { "doublearr
37200 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20  ay_addr",       
37210 20 20 20 20 20 20 20 74 65 73 74 5f 64 6f 75 62         test_doub
37220 6c 65 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20  learray_addr, 0 
37230 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 61  },.     { "texta
37240 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
37250 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
37260 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 2c 20  textarray_addr, 
37270 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37280 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20  ite3_bind_int", 
37290 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
372a0 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20  t_bind_int,     
372b0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
372c0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
372d0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74 65  lob",         te
372e0 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
372f0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
37300 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
37310 62 6c 6f 62 36 34 22 2c 20 20 20 20 20 20 20 74  blob64",       t
37320 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  est_bind_zeroblo
37330 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  b64, 0 },.     {
37340 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
37350 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
37360 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36    test_bind_int6
37370 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  4,    0 },.     
37380 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
37390 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
373a0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75     test_bind_dou
373b0 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ble,   0 },.    
373c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
373d0 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  _null",         
373e0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75      test_bind_nu
373f0 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ll     ,0 },.   
37400 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
37410 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20  d_text",        
37420 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
37430 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ext     ,0 },.  
37440 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
37450 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20  nd_text16",     
37460 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
37470 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20  text16   ,0 },. 
37480 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
37490 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  ind_blob",      
374a0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
374b0 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a  _blob     ,0 },.
374c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
374d0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
374e0 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e  ount",  test_bin
374f0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
37500 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  t, 0},.     { "s
37510 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
37520 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74  meter_name",   t
37530 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
37540 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20  er_name,  0},.  
37550 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
37560 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
37570 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  ex",  test_bind_
37580 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c  parameter_index,
37590 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
375a0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
375b0 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73  ngs",        tes
375c0 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
375d0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
375e0 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
37600 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
37610 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
37620 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
37640 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
37650 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
37660 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
37670 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
37680 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20  test_ex_errcode 
37690 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
376a0 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22  "sqlite3_errmsg"
376b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
376c0 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20   test_errmsg    
376d0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
376e0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
376f0 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
37700 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
37710 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
37720 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22  { "sqlite3_open"
37730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37740 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20     test_open    
37750 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
37760 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
37770 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
37780 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20      test_open16 
37790 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
377a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
377b0 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  n_v2",          
377c0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76       test_open_v
377d0 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  2       ,0 },.  
377e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
377f0 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
37800 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
37810 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 20  ete16    ,0 },. 
37820 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e      { "sqlite3_n
37830 6f 72 6d 61 6c 69 7a 65 22 2c 20 20 20 20 20 20  ormalize",      
37840 20 20 20 20 20 20 20 74 65 73 74 5f 6e 6f 72 6d         test_norm
37850 61 6c 69 7a 65 20 20 20 20 20 2c 30 20 7d 2c 0a  alize     ,0 },.
37860 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37870 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20  _prepare",      
37880 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
37890 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d  epare       ,0 }
378a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
378b0 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20  3_prepare16",   
378c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
378d0 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20  repare16     ,0 
378e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
378f0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  e3_prepare_v2", 
37900 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
37910 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30  prepare_v2    ,0
37920 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37930 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 22 2c  te3_prepare_v3",
37940 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
37950 5f 70 72 65 70 61 72 65 5f 76 33 20 20 20 20 2c  _prepare_v3    ,
37960 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37970 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
37980 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73  3134",       tes
37990 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
379a0 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  4, 0},.     { "s
379b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
379c0 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74  _v2",          t
379d0 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
379e0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
379f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
37a00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37a10 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
37a20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
37a30 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74  "sqlite3_stmt_st
37a40 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
37a50 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
37a60 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  s   ,0 },.     {
37a70 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22   "sqlite3_reset"
37a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37a90 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20    test_reset    
37aa0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
37ab0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72  { "sqlite3_expir
37ac0 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
37ad0 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20     test_expired 
37ae0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
37af0 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e   { "sqlite3_tran
37b00 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  sfer_bindings", 
37b10 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65      test_transfe
37b20 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20  r_bind ,0 },.   
37b30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61    { "sqlite3_cha
37b40 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
37b50 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65       test_change
37b60 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  s       ,0 },.  
37b70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
37b80 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
37b90 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20        test_step 
37ba0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
37bb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
37bc0 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ql",            
37bd0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20         test_sql 
37be0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
37bf0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37c00 65 78 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20 20  expanded_sql",  
37c10 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f          test_ex_
37c20 73 71 6c 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  sql        ,0 },
37c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
37c40 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a  NABLE_NORMALIZE.
37c50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37c60 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73 71 6c 22 2c  normalized_sql",
37c70 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 6f 72          test_nor
37c80 6d 5f 73 71 6c 20 20 20 20 20 20 2c 30 20 7d 2c  m_sql      ,0 },
37c90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
37ca0 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
37cb0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
37cc0 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20  test_next_stmt  
37cd0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
37ce0 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65  "sqlite3_stmt_re
37cf0 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20  adonly",        
37d00 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f   test_stmt_reado
37d10 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nly ,0 },.     {
37d20 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69   "sqlite3_stmt_i
37d30 73 65 78 70 6c 61 69 6e 22 2c 20 20 20 20 20 20  sexplain",      
37d40 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 73 65 78    test_stmt_isex
37d50 70 6c 61 69 6e 2c 30 20 7d 2c 0a 20 20 20 20 20  plain,0 },.     
37d60 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
37d70 62 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20  busy",          
37d80 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73     test_stmt_bus
37d90 79 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  y     ,0 },.    
37da0 20 7b 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f   { "uses_stmt_jo
37db0 75 72 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20  urnal",         
37dc0 20 20 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f      uses_stmt_jo
37dd0 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20  urnal ,0 },..   
37de0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c    { "sqlite3_rel
37df0 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20  ease_memory",   
37e00 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73       test_releas
37e10 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d  e_memory,     0}
37e20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37e30 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
37e40 6f 72 79 22 2c 20 20 20 20 20 74 65 73 74 5f 64  ory",     test_d
37e50 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
37e60 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ,  0},.     { "s
37e70 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
37e80 6c 75 73 68 22 2c 20 20 20 20 20 20 20 20 20 74  lush",         t
37e90 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73  est_db_cacheflus
37ea0 68 2c 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  h,      0},.    
37eb0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 79 73 74   { "sqlite3_syst
37ec0 65 6d 5f 65 72 72 6e 6f 22 2c 20 20 20 20 20 20  em_errno",      
37ed0 20 20 20 20 74 65 73 74 5f 73 79 73 74 65 6d 5f      test_system_
37ee0 65 72 72 6e 6f 2c 20 20 20 20 20 20 20 30 7d 2c  errno,       0},
37ef0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37f00 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20  _db_filename",  
37f10 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62           test_db
37f20 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  _filename,      
37f30 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
37f40 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
37f50 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  y",           te
37f60 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20  st_db_readonly, 
37f70 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
37f80 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  { "sqlite3_soft_
37f90 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20  heap_limit",    
37fa0 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61     test_soft_hea
37fb0 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a  p_limit,    0},.
37fc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37fd0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
37fe0 34 22 2c 20 20 20 20 20 74 65 73 74 5f 73 6f 66  4",     test_sof
37ff0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20  t_heap_limit,   
38000 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
38010 69 74 65 33 5f 68 61 72 64 5f 68 65 61 70 5f 6c  ite3_hard_heap_l
38020 69 6d 69 74 36 34 22 2c 20 20 20 20 20 74 65 73  imit64",     tes
38030 74 5f 68 61 72 64 5f 68 65 61 70 5f 6c 69 6d 69  t_hard_heap_limi
38040 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  t,    0},.     {
38050 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64   "sqlite3_thread
38060 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20  _cleanup",      
38070 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c    test_thread_cl
38080 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20  eanup,     0},. 
38090 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
380a0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c  ager_refcounts",
380b0 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65         test_page
380c0 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20  r_refcounts,    
380d0 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c  0},..     { "sql
380e0 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
380f0 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73  ion",        tes
38100 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
38110 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
38120 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
38130 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
38140 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  , test_enable_lo
38150 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ad,        0},. 
38160 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
38170 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
38180 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65  odes", test_exte
38190 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
381a0 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
381b0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20  qlite3_limit",  
381c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
381d0 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20  est_limit,      
381e0 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20             0},. 
381f0 20 20 20 20 7b 20 22 64 62 63 6f 6e 66 69 67 5f      { "dbconfig_
38200 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75  maindbname_icecu
38210 62 65 22 2c 20 20 20 74 65 73 74 5f 64 62 63 6f  be",   test_dbco
38220 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f  nfig_maindbname_
38230 69 63 65 63 75 62 65 20 7d 2c 0a 0a 20 20 20 20  icecube },..    
38240 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74   { "save_prng_st
38250 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
38260 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74      save_prng_st
38270 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  ate,    0 },.   
38280 20 20 7b 20 22 72 65 73 74 6f 72 65 5