/ Hex Artifact Content
Login

Artifact dba1b71424954bd61725cdc09d7af44cee99dd9bd58e72b80c743adde5809019:


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 54 68 69 73  );.}../*.** This
6d30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 65   SQL function re
6d40: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
6d50: 72 20 76 61 6c 75 65 20 6f 66 20 69 74 73 20 61  r value of its a
6d60: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 4d 45 4d  rgument as a MEM
6d70: 5f 49 6e 74 52 65 61 6c 0a 2a 2a 20 76 61 6c 75  _IntReal.** valu
6d80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6d90: 64 20 69 6e 74 72 65 61 6c 46 75 6e 63 74 69 6f  d intrealFunctio
6da0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
6db0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6dc0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6dd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6de0: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
6df0: 33 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  3_int64 v = sqli
6e00: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
6e10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  argv[0]);.  sqli
6e20: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
6e30: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
6e40: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
6e50: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
6e60: 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49 4e 54 52  CTRL_RESULT_INTR
6e70: 45 41 4c 2c 20 63 6f 6e 74 65 78 74 29 3b 0a 7d  EAL, context);.}
6e80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
6e90: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6ea0: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
6eb0: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
6ec0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6ed0: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
6ee0: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
6ef0: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
6f00: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
6f10: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
6f20: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6f30: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
6f40: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
6f50: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
6f60: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
6f70: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
6f80: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
6f90: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
6fa0: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
6fb0: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
6fc0: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
6fd0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
6fe0: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
6ff0: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
7000: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
7010: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
7020: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
7030: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
7040: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
7050: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
7060: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7070: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
7080: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
7090: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
70a0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
70b0: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
70c0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
70d0: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
70e0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
70f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
7100: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
7110: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
7120: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
7130: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
7140: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
7150: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
7160: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7170: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
7180: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
7190: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
71a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
71b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
71c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
71d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
71e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
71f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
7200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7210: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
7220: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
7230: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
7240: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
7250: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7270: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
7280: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
72a0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
72b0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
72c0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44  v[0],.       " D
72d0: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
72e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
72f0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
7300: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
7310: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
7320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
7340: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7350: 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22  db, "x_coalesce"
7360: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
7370: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74  8, 0, .        t
7380: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c  1_ifnullFunc, 0,
7390: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
73a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
73b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
73c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
73d0: 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49   "hex8", 1, SQLI
73e0: 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
73f0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
7400: 20 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78            0, hex
7410: 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  8Func, 0, 0);.  
7420: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7430: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66  _OMIT_UTF16.  if
7440: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7450: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7460: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7470: 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c  ion(db, "hex16",
7480: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
7490: 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
74a0: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
74b0: 20 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c     0, hex16Func,
74c0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
74d0: 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  if.  if( rc==SQL
74e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
74f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
7500: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
7510: 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c  tkt2213func", 1,
7520: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
7530: 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32  .          tkt22
7540: 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  13Function, 0, 0
7550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
7560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7580: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7590: 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e  b, "pointer_chan
75a0: 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  ge", 4, SQLITE_A
75b0: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
75c0: 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f    ptrChngFunctio
75d0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  n, 0, 0);.  }.. 
75e0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f   /* Functions co
75f0: 75 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75  unter1() and cou
7600: 6e 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65  nter2() have the
7610: 20 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61   same implementa
7620: 74 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a  tion - they.  **
7630: 20 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20   both return an 
7640: 61 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65  ascending intege
7650: 72 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  r with each call
7660: 2e 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28  .  But counter1(
7670: 29 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a  ) is marked.  **
7680: 20 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   as non-determin
7690: 69 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65  istic and counte
76a0: 72 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61  r2() is marked a
76b0: 73 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e  s deterministic.
76c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
76d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
76f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7700: 2c 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31  , "counter1", -1
7710: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
7720: 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64           0, nond
7730: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
7740: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7750: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7760: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7770: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7780: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f  function(db, "co
7790: 75 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c  unter2", -1, SQL
77a0: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
77b0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
77c0: 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64           0, nond
77d0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
77e0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
77f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 74 72 65  ..  /* The intre
7800: 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 6f  al() function co
7810: 6e 76 65 72 74 73 20 69 74 73 20 61 72 67 75 6d  nverts its argum
7820: 65 6e 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ent to an intege
7830: 72 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 20  r and returns.  
7840: 2a 2a 20 69 74 20 61 73 20 61 20 4d 45 4d 5f 49  ** it as a MEM_I
7850: 6e 74 52 65 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ntReal..  */.  i
7860: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7880: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7890: 74 69 6f 6e 28 64 62 2c 20 22 69 6e 74 72 65 61  tion(db, "intrea
78a0: 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
78b0: 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  F8,.          0,
78c0: 20 69 6e 74 72 65 61 6c 46 75 6e 63 74 69 6f 6e   intrealFunction
78d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69  , 0, 0);.  }..#i
78e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
78f0: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65  T_UTF16.  /* Use
7900: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
7910: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29  ate_function16()
7920: 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c   API here. Mainl
7930: 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61  y for fun, but a
7940: 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73  lso .  ** becaus
7950: 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74  e it is not test
7960: 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65  ed anywhere else
7970: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
7980: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7990: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
79a0: 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  16;.    sqlite3_
79b0: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20  value *pVal;.   
79c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
79d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
79e0: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
79f0: 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
7a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
7a10: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
7a20: 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  , "x_sqlite_exec
7a30: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
7a40: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7a50: 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c      zUtf16 = sql
7a60: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
7a70: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  al, SQLITE_UTF16
7a80: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
7a90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7aa0: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
7ab0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7ad0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7ae0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62  te_function16(db
7af0: 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20  , zUtf16, .     
7b00: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53 51             1, SQ
7b10: 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20  LITE_UTF16, db, 
7b20: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c  sqlite3ExecFunc,
7b30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7b40: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7b50: 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71  ee(pVal);.    sq
7b60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7b70: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7b80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
7b90: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
7ba0: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
7bb0: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
7bc0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
7bd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
7be0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
7bf0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
7c00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7c10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7c20: 6c 69 74 65 33 5f 64 72 6f 70 5f 6d 6f 64 75 6c  lite3_drop_modul
7c30: 65 73 20 44 42 20 3f 4e 41 4d 45 20 2e 2e 2e 3f  es DB ?NAME ...?
7c40: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
7c50: 65 20 73 71 6c 69 74 65 33 5f 64 72 6f 70 5f 6d  e sqlite3_drop_m
7c60: 6f 64 75 6c 65 73 28 44 2c 4c 29 20 69 6e 74 65  odules(D,L) inte
7c70: 72 66 61 63 65 20 6f 6e 20 64 61 74 61 62 61 73  rface on databas
7c80: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
7c90: 44 42 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  DB, in order to 
7ca0: 64 72 6f 70 20 61 6c 6c 20 6d 6f 64 75 6c 65 73  drop all modules
7cb0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 6e 61   except those na
7cc0: 6d 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  med in.** the ar
7cd0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
7ce0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
7cf0: 41 50 49 20 74 65 73 74 5f 64 72 6f 70 5f 6d 6f  API test_drop_mo
7d00: 64 75 6c 65 73 28 0a 20 20 76 6f 69 64 20 2a 4e  dules(.  void *N
7d10: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
7d20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
7d30: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
7d40: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
7d50: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
7d60: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d80: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
7d90: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
7da0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
7db0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
7dc0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
7dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
7de0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
7df0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7e00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
7e10: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7e20: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7e30: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
7e40: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7e60: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
7e70: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7e80: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
7e90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7ea0: 20 20 73 71 6c 69 74 65 33 5f 64 72 6f 70 5f 6d    sqlite3_drop_m
7eb0: 6f 64 75 6c 65 73 28 64 62 2c 20 61 72 67 63 3e  odules(db, argc>
7ec0: 32 20 3f 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  2 ? (const char*
7ed0: 2a 29 28 61 72 67 76 2b 32 29 20 3a 20 30 29 3b  *)(argv+2) : 0);
7ee0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
7f00: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
7f10: 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61   the x_count() a
7f20: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7f30: 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74  n..**.** x_count
7f40: 28 29 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75  () counts the nu
7f50: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c  mber of non-null
7f60: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74   arguments.  But
7f70: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f   there are.** so
7f80: 6d 65 20 74 77 69 73 74 73 20 66 6f 72 20 74 65  me twists for te
7f90: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
7fa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67  **.** If the arg
7fb0: 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74  ument to x_count
7fc0: 28 29 20 69 73 20 34 30 20 74 68 65 6e 20 61 20  () is 40 then a 
7fd0: 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72  UTF-8 error is r
7fe0: 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68  eported.** on th
7ff0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
8000: 20 20 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29    If x_count(41)
8010: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61   is seen, then a
8020: 20 55 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a   UTF-16 error.**
8030: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
8040: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
8050: 6e 2e 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c  n.  If the total
8060: 20 63 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68   count is 42, th
8070: 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72  en.** a UTF-8 er
8080: 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20  ror is reported 
8090: 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20  on the finalize 
80a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
80b0: 65 64 65 66 20 73 74 72 75 63 74 20 74 31 43 6f  edef struct t1Co
80c0: 75 6e 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74  untCtx t1CountCt
80d0: 78 3b 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e  x;.struct t1Coun
80e0: 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  tCtx {.  int n;.
80f0: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  };.static void t
8100: 31 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  1CountStep(.  sq
8110: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8120: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
8130: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8140: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8150: 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20  t1CountCtx *p;. 
8160: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
8170: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
8180: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
8190: 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63  p));.  if( (argc
81a0: 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  ==0 || SQLITE_NU
81b0: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
81c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
81d0: 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d  ) && p ){.    p-
81e0: 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >n++;.  }.  if( 
81f0: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  argc>0 ){.    in
8200: 74 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t v = sqlite3_va
8210: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
8220: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20  ;.    if( v==40 
8230: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8240: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8250: 6e 74 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66  ntext, "value of
8260: 20 34 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f   40 handed to x_
8270: 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66  count", -1);.#if
8280: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8290: 5f 55 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65  _UTF16.    }else
82a0: 20 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20   if( v==41 ){.  
82b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a      const char z
82c0: 55 74 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20  Utf16ErrMsg[] = 
82d0: 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78  { 0, 0x61, 0, 0x
82e0: 36 32 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20  62, 0, 0x63, 0, 
82f0: 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0};.      sql
8300: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8310: 72 31 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55  r16(context, &zU
8320: 74 66 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c  tf16ErrMsg[1-SQL
8330: 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20  ITE_BIGENDIAN], 
8340: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
8350: 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69  }.  }.}   .stati
8360: 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69  c void t1CountFi
8370: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
8380: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
8390: 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a  {.  t1CountCtx *
83a0: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
83b0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
83c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
83d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
83e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
83f0: 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ==42 ){.      sq
8400: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8410: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63  or(context, "x_c
8420: 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34  ount totals to 4
8430: 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  2", -1);.    }el
8440: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8450: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
8460: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a  text, p ? p->n :
8470: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   0);.    }.  }.}
8480: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8490: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
84a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
84b0: 61 63 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20  acyCountStep(.  
84c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
84d0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
84e0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
84f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8500: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a    /* no-op */.}.
8510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
8520: 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  acyCountFinalize
8530: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8540: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71   *context){.  sq
8550: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
8560: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
8570: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8580: 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23  t(context));.}.#
8590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
85a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ge:  sqlite3_cre
85b0: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
85c0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
85d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
85e0: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
85f0: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
8600: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
8610: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
8620: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
8630: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
8640: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  on is similar.**
8650: 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   to the built-in
8660: 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f   count() functio
8670: 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20 73 70  n, with a few sp
8680: 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20  ecial quirks.** 
8690: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
86a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
86b0: 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a  rror() APIs..**.
86c0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
86d0: 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74  motivation for t
86e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
86f0: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61  to be able to ca
8700: 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ll the.** sqlite
8710: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
8720: 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  te function whil
8730: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
8740: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
8750: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
8760: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
8770: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20  etection logic. 
8780: 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74   See misuse.test
8790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
87a0: 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65  tine was later e
87b0: 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20  xtended to test 
87c0: 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74  the use of sqlit
87d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
87e0: 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72  ).** within aggr
87f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
8800: 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74  .**.** Later: It
8810: 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74   is now also ext
8820: 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73 74 65  ended to registe
8830: 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  r the aggregate 
8840: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67  function.** "leg
8850: 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74  acy_count()" wit
8860: 68 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 64  h the supplied d
8870: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
8880: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
8890: 74 6f 20 74 65 73 74 20 74 68 65 20 64 65 70 72  to test the depr
88a0: 65 63 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61  ecated sqlite3_a
88b0: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
88c0: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
88d0: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
88e0: 49 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  I test_create_ag
88f0: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8900: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8910: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8920: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
8930: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
8940: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
8950: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
8960: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8980: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8990: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
89a0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
89b0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
89c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
89d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
89e0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8a00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8a10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8a20: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a30: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
8a40: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
8a50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8a60: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
8a70: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
8a80: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8aa0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8ab0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8ac0: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
8ad0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8ae0: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
8af0: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8b00: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
8b10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8b20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8b30: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8b40: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
8b50: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8b60: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
8b70: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
8b80: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ba0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8bc0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8bd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8be0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
8bf0: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8c00: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
8c10: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
8c20: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
8c30: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
8c40: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8c50: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
8c60: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
8c70: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
8c80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8c90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8ca0: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8cb0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8cd0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
8ce0: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
8cf0: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8d00: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8d10: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8d20: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
8d30: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
8d40: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
8d50: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
8d60: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
8d70: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
8d80: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8d90: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8da0: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8db0: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8dc0: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
8dd0: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
8de0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8df0: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
8e00: 49 20 74 65 73 74 5f 70 72 69 6e 74 66 28 0a 20  I test_printf(. 
8e10: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8e20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8e30: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8e40: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8e50: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8e60: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8e70: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8e80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8e90: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8ea0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8ec0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8ed0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72  t */.){.  if( ar
8ee0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
8ef0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8f00: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8f10: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
8f20: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
8f30: 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30      " TEXT\"", 0
8f40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8f50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
8f60: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 72  rintf("%s\n", ar
8f70: 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e  gv[1]);.  return
8f80: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a   TCL_OK;.}..../*
8f90: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
8fa0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
8fb0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
8fc0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a  NTEGER INTEGER.*
8fd0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
8fe0: 66 20 77 69 74 68 20 74 68 72 65 65 20 69 6e 74  f with three int
8ff0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a  eger arguments.*
9000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
9010: 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74  ITE_TCLAPI sqlit
9020: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a  e3_mprintf_int(.
9030: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9040: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9050: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9060: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9070: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9080: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9090: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
90a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
90b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
90c0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
90d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
90e0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
90f0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9100: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
9110: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9120: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9130: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9140: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9150: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9160: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
9170: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
9180: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
9190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
91a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
91b0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
91c0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
91d0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
91e0: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
91f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9200: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9210: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9220: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
9230: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
9240: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
9250: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
9260: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
9270: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9280: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
9290: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20  3_mprintf_int64 
92a0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
92b0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a  NTEGER INTEGER.*
92c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
92d0: 66 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d  f with three 64-
92e0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75  bit integer argu
92f0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
9300: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9310: 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  I sqlite3_mprint
9320: 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  f_int64(.  void 
9330: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9340: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9350: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9360: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9370: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9380: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9390: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
93a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
93b0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
93c0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
93d0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
93e0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
93f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
9400: 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a  ite_int64 a[3];.
9410: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9420: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9430: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9440: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9450: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9460: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9470: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9480: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
9490: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
94a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
94b0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
94c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
94d0: 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b 69  te3Atoi64(argv[i
94e0: 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73 71 6c 69  ], &a[i-2], sqli
94f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 61 72 67 76  te3Strlen30(argv
9500: 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  [i]), SQLITE_UTF
9510: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
9520: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9530: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
9540: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
9550: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
9560: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9570: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9580: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9590: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
95a0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
95b0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
95c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
95d0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
95e0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
95f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9600: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9610: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
9620: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
9630: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
9640: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
9650: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
9660: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
9670: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
9680: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
9690: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
96a0: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
96b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
96c0: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
96d0: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
96e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
96f0: 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74  ITE_TCLAPI sqlit
9700: 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 28  e3_mprintf_long(
9710: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
9720: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9730: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9740: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9750: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9760: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9770: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9790: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
97a0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
97b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
97c0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
97d0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
97e0: 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61 5b  i;.  long int a[
97f0: 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b 0a  3];.  int b[3];.
9800: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9810: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9820: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9830: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9840: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9850: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9860: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9870: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
9880: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9890: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
98a0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
98b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
98c0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
98d0: 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d 29  rgv[i], &b[i-2])
98e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
98f0: 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20  ROR;.    a[i-2] 
9900: 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69 2d  = (long int)b[i-
9910: 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 26  2];.    a[i-2] &
9920: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28 73 69  = (((u64)1)<<(si
9930: 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31 3b  zeof(int)*8))-1;
9940: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9950: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9960: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
9970: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
9980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9990: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
99a0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
99b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
99c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
99d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
99e0: 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  r FORMAT INTEGER
99f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9a00: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9a10: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9a20: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9a30: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9a40: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9a50: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9a60: 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  I sqlite3_mprint
9a70: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
9a80: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9a90: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9aa0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9ab0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9ac0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9ad0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9af0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9b00: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9b10: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9b20: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9b30: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9b40: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
9b50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9b60: 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35  argc<4 || argc>5
9b70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9b80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9b90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9ba0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9bb0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
9bc0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
9bd0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
9be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9bf0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
9c00: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
9c10: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
9c20: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
9c30: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
9c40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9c50: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
9c60: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
9c70: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
9c80: 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 34   argc>4 ? argv[4
9c90: 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c  ] : NULL);.  Tcl
9ca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9cb0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
9cc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
9cd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
9cf0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9d00: 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52 20 46  tf_str INTEGER F
9d10: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
9d20: 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a  TEGER STRING.**.
9d30: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9d40: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
9d50: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
9d60: 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  ne string argume
9d70: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
9d80: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
9d90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
9da0: 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  str(.  void *Not
9db0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
9dc0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9dd0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9de0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9df0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9e00: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9e20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9e30: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
9e40: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
9e50: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
9e60: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
9e70: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69  int a[3], i;.  i
9e80: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt n;.  char *z;
9e90: 0a 20 20 69 66 28 20 61 72 67 63 3c 35 20 7c 7c  .  if( argc<5 ||
9ea0: 20 61 72 67 63 3e 36 20 29 7b 0a 20 20 20 20 54   argc>6 ){.    T
9eb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9ec0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9ed0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9ee0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9ef0: 20 20 20 20 20 20 22 20 49 4e 54 20 46 4f 52 4d        " INT FORM
9f00: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
9f10: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
9f20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9f30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
9f40: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9f50: 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65  rgv[1], &n) ) re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9f70: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
9f80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9f90: 74 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73  t(interp, "N mus
9fa0: 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
9fb0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
9fc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9fd0: 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35  }.  for(i=3; i<5
9fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9ff0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
a000: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
a010: 2d 33 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -3]) ) return TC
a020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
a030: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
a040: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69  c( n+1 );.  sqli
a050: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
a060: 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d  z, argv[2], a[0]
a070: 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f  , a[1], argc>4 ?
a080: 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29   argv[5] : NULL)
a090: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a0a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a0b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a0c0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a0d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a0e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
a0f0: 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
a100: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
a110: 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a  NTEGER DOUBLE.**
a120: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
a130: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
a140: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
a150: 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  one double argum
a160: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
a170: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
a180: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a190: 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
a1a0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
a1b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a1c0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a1d0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a1e0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a1f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
a200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a220: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
a230: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
a240: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
a250: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
a260: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
a270: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68    double r;.  ch
a280: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
a290: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
a2a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a2b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a2c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a2d0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
a2e0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
a2f0: 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  INT DOUBLE\"", 0
a300: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a310: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
a320: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
a330: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a340: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
a350: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20  gv[i], &a[i-2]) 
a360: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a370: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
a380: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a390: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29  rp, argv[4], &r)
a3a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a3b0: 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ROR;.  z = sqlit
a3c0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
a3d0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
a3e0: 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  r);.  Tcl_Append
a3f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a400: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a410: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a420: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a430: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
a440: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
a450: 64 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  d FORMAT DOUBLE 
a460: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
a470: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
a480: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
a490: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
a4a0: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
a4b0: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
a4c0: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
a4d0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
a4e0: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
a4f0: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
a500: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
a510: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
a520: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
a530: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
a540: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a550: 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  API sqlite3_mpri
a560: 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f  ntf_scaled(.  vo
a570: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a580: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a590: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a5a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a5b0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a5c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a5d0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a5e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a5f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a600: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a610: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a620: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a630: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
a640: 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63  double r[2];.  c
a650: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a660: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
a670: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a680: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a690: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a6a0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a6b0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55      " FORMAT DOU
a6c0: 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  BLE DOUBLE\"", 0
a6d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a6e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
a6f0: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
a700: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a710: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
a720: 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32   argv[i], &r[i-2
a730: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
a740: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
a750: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a760: 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72  (argv[1], r[0]*r
a770: 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [1]);.  Tcl_Appe
a780: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a790: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
a7a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
a7b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a7c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
a7d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
a7e0: 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49  only FORMAT STRI
a7f0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
a800: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a810: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a820: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
a830: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
a840: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
a850: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
a860: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
a870: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
a880: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
a890: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
a8a0: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
a8b0: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
a8c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
a8d0: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
a8e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a8f0: 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  stronly(.  void 
a900: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
a910: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a920: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a930: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a940: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a950: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
a960: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a980: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
a990: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
a9a0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
a9b0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
a9c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
a9d0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
a9e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a9f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
aa00: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
aa10: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
aa20: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
aa30: 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b  T STRING\"", 0);
aa40: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aa50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
aa60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
aa70: 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32  (argv[1], argv[2
aa80: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
aa90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
aaa0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
aab0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
aac0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
aad0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
aae0: 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
aaf0: 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58 0a  uble FORMAT HEX.
ab00: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
ab10: 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  tf with a single
ab20: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
ab30: 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65   which is derive
ab40: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68 65  d from the.** he
ab50: 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69  xadecimal encodi
ab60: 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64 6f  ng of an IEEE do
ab70: 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
ab80: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
ab90: 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  I sqlite3_mprint
aba0: 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76  f_hexdouble(.  v
abb0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
abc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
abd0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
abe0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
abf0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
ac00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
ac10: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
ac20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ac40: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
ac50: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
ac60: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
ac70: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
ac80: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75  .  double r;.  u
ac90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20  nsigned int x1, 
aca0: 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e  x2;.  sqlite_uin
acb0: 74 36 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67  t64 d;.  if( arg
acc0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
acd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ace0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
acf0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
ad00: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
ad10: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
ad20: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
ad30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ad40: 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e  .  }.  if( sscan
ad50: 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78  f(argv[2], "%08x
ad60: 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29  %08x", &x2, &x1)
ad70: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
ad80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ad90: 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e  rp, "2nd argumen
ada0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63  t should be 16-c
adb0: 68 61 72 61 63 74 65 72 73 20 6f 66 20 68 65 78  haracters of hex
adc0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
add0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ade0: 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d  .  d = x2;.  d =
adf0: 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20   (d<<32) + x1;. 
ae00: 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20   memcpy(&r, &d, 
ae10: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20  sizeof(r));.  z 
ae20: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
ae30: 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20  f(argv[1], r);. 
ae40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ae50: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
ae60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ae70: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
ae80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ae90: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61  age: sqlite3_ena
aea0: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
aeb0: 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f   ?BOOLEAN?.**.*/
aec0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
aed0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
aee0: 5f 43 41 43 48 45 29 0a 73 74 61 74 69 63 20 69  _CACHE).static i
aef0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
af00: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
af10: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
af20: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
af30: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
af40: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
af50: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
af60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
af70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
af80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
af90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
afa0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
afb0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
afc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
afd0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
afe0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
aff0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b000: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b010: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
b020: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
b030: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
b040: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
b050: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b060: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b070: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
b080: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
b090: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b0a0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
b0b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
b0c0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
b0d0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
b0e0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
b0f0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
b100: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
b110: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
b120: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b130: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
b140: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
b150: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
b160: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
b170: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b180: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
b190: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
b1a0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
b1b0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
b1c0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
b1d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
b1f0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b200: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
b210: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
b220: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b230: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
b240: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
b250: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
b260: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
b270: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
b280: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
b290: 41 50 49 20 74 65 73 74 5f 65 78 74 65 6e 64 65  API test_extende
b2a0: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a  d_result_codes(.
b2b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b2c0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b2d0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b2e0: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b2f0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b300: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b310: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b320: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b330: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b340: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b360: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b370: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b380: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b390: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b3a0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
b3b0: 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  enable;.  sqlite
b3c0: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
b3d0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
b3e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b3f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b400: 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
b410: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b420: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b430: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b440: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b450: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b460: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b470: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
b480: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
b490: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
b4a0: 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75   &enable) ) retu
b4b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b4c0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
b4d0: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62  _result_codes(db
b4e0: 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74  , enable);.  ret
b4f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
b500: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
b510: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
b520: 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  umber.**.*/.stat
b530: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
b540: 4c 41 50 49 20 74 65 73 74 5f 6c 69 62 76 65 72  LAPI test_libver
b550: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43  sion_number(.  C
b560: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
b570: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
b580: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
b590: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
b5a0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
b5b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
b5c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
b5d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
b5e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
b5f0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
b600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b610: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b620: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b630: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b640: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b650: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74   */.){.  Tcl_Set
b660: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b670: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
b680: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
b690: 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20  on_number()));. 
b6a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b6b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
b6c0: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
b6d0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20 44 42  lumn_metadata DB
b6e0: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b6f0: 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74  colname.**.*/.st
b700: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
b710: 54 43 4c 41 50 49 20 74 65 73 74 5f 74 61 62 6c  TCLAPI test_tabl
b720: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
b730: 61 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  a(.  ClientData 
b740: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
b750: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
b760: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
b770: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
b780: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
b790: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
b7a0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
b7b0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
b7c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
b7d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
b7e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
b7f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
b800: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
b810: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
b820: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
b830: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
b840: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
b850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
b860: 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
b870: 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zCol;.  int rc;
b880: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
b890: 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
b8a0: 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f  *zDatatype;.  co
b8b0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73  nst char *zColls
b8c0: 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c  eq;.  int notnul
b8d0: 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  l;.  int primary
b8e0: 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  key;.  int autoi
b8f0: 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28  ncrement;..  if(
b900: 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
b910: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
b920: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b930: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b940: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b950: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b960: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b970: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b980: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b990: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b9a0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b9c0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b9d0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b9e0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b9f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
ba00: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62 6a 63 3d  ;.  zCol = objc=
ba10: 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69  =5 ? Tcl_GetStri
ba20: 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a 20 30 3b  ng(objv[4]) : 0;
ba30: 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ..  if( strlen(z
ba40: 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30  Db)==0 ) zDb = 0
ba50: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
ba60: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
ba70: 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c  etadata(db, zDb,
ba80: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20   zTbl, zCol, .  
ba90: 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20      &zDatatype, 
baa0: 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e  &zCollseq, &notn
bab0: 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79  ull, &primarykey
bac0: 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  , &autoincrement
bad0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
bae0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
baf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bb00: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
bb10: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
bb20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bb30: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
bb40: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
bb50: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
bb60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
bb70: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
bb80: 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65  ingObj(zDatatype
bb90: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
bba0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bbb0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
bbc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f  NewStringObj(zCo
bbd0: 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54  llseq, -1));.  T
bbe0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
bbf0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
bc00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
bc10: 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f  otnull));.  Tcl_
bc20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
bc30: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
bc40: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d  l_NewIntObj(prim
bc50: 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f  arykey));.  Tcl_
bc60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
bc70: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
bc80: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f  l_NewIntObj(auto
bc90: 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54  increment));.  T
bca0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
bcb0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
bcc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
bcd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
bce0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
bcf0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
bd00: 49 54 45 5f 54 43 4c 41 50 49 20 62 6c 6f 62 48  ITE_TCLAPI blobH
bd10: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20  andleFromObj(.  
bd20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bd30: 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  rp, .  Tcl_Obj *
bd40: 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f  pObj,.  sqlite3_
bd50: 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b  blob **ppBlob.){
bd60: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
bd70: 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f  t n;..  z = Tcl_
bd80: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bd90: 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66  (pObj, &n);.  if
bda0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ( n==0 ){.    *p
bdb0: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c  pBlob = 0;.  }el
bdc0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  se{.    int notU
bdd0: 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  sed;.    Tcl_Cha
bde0: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20  nnel channel;.  
bdf0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
be00: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a  tanceData;.    .
be10: 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63      channel = Tc
be20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
be30: 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64  erp, z, &notUsed
be40: 29 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e  );.    if( !chan
be50: 6e 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c  nel ) return TCL
be60: 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c  _ERROR;..    Tcl
be70: 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b  _Flush(channel);
be80: 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68  .    Tcl_Seek(ch
be90: 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53  annel, 0, SEEK_S
bea0: 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e  ET);..    instan
beb0: 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74  ceData = Tcl_Get
bec0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
bed0: 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20  ata(channel);.  
bee0: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73    *ppBlob = *((s
bef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69  qlite3_blob **)i
bf00: 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20  nstanceData);.  
bf10: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
bf20: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
bf30: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
bf40: 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
bf50: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
bf60: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
bf70: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
bf80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
bf90: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
bfa0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
bfb0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
bfc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
bfd0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
bfe0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
bff0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c000: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c010: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c020: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c030: 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
c040: 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  id;.  sqlite3_bl
c050: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
c060: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
c070: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
c080: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c090: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
c0a0: 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20  ANNEL ROWID");. 
c0b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c0c0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
c0d0: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
c0e0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
c0f0: 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74  ], &pBlob) ) ret
c100: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c110: 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65   if( Tcl_GetWide
c120: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
c130: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f  p, objv[2], &iRo
c140: 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54 43  wid) ) return TC
c150: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
c160: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
c170: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77  open(pBlob, iRow
c180: 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  id);.  if( rc!=S
c190: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c1a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c1b0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
c1c0: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
c1d0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c1e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
c1f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
c200: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
c210: 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a  OR);.}..#endif..
c220: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
c230: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c240: 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44  ation_v2 DB-HAND
c250: 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43  LE NAME CMP-PROC
c260: 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20   DEL-PROC.**.** 
c270: 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20    This Tcl proc 
c280: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c290: 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d 65  ing the experime
c2a0: 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ntal.**   sqlite
c2b0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
c2c0: 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63  on_v2() interfac
c2d0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73  e..*/.struct Tes
c2e0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20  tCollationX {.  
c2f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c300: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
c310: 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Cmp;.  Tcl_Obj *
c320: 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  pDel;.};.typedef
c330: 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c   struct TestColl
c340: 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61  ationX TestColla
c350: 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f  tionX;.static vo
c360: 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  id testCreateCol
c370: 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a  lationDel(void *
c380: 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c  pCtx){.  TestCol
c390: 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65  lationX *p = (Te
c3a0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70  stCollationX *)p
c3b0: 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Ctx;..  int rc =
c3c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
c3d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65  ->interp, p->pDe
c3e0: 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  l, TCL_EVAL_DIRE
c3f0: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c400: 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  AL);.  if( rc!=T
c410: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
c420: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
c430: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
c440: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
c450: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
c460: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c470: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71  t(p->pDel);.  sq
c480: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
c490: 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20   *)p);.}.static 
c4a0: 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43 6f  int testCreateCo
c4b0: 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f  llationCmp(.  vo
c4c0: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
c4d0: 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76  nLeft,.  const v
c4e0: 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e  oid *zLeft,.  in
c4f0: 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73  t nRight,.  cons
c500: 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29  t void *zRight.)
c510: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
c520: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
c530: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
c540: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
c550: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
c560: 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a  teObj(p->pCmp);.
c570: 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a    int iRes = 0;.
c580: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
c590: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
c5a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
c5b0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
c5c0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
c5d0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c  ngObj((char *)zL
c5e0: 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20  eft, nLeft));.  
c5f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
c600: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
c610: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
c620: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52  ngObj((char *)zR
c630: 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a  ight,nRight));..
c640: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
c650: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
c660: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
c670: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
c680: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
c690: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
c6a0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
c6b0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  (p->interp, Tcl_
c6c0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
c6d0: 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a  interp), &iRes).
c6e0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
c6f0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
c700: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54  interp);.  }.  T
c710: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c720: 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74  pScript);..  ret
c730: 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74  urn iRes;.}.stat
c740: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
c750: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
c760: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
c770: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
c780: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
c790: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
c7a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
c7b0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
c7c0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
c7d0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
c7e0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c800: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
c810: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
c820: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
c830: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
c840: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73  ents */.){.  Tes
c850: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a  tCollationX *p;.
c860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c870: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
c880: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
c890: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c8a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c8b0: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45   "DB-HANDLE NAME
c8c0: 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52   CMP-PROC DEL-PR
c8d0: 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OC");.    return
c8e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c8f0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
c900: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
c910: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
c920: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
c930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70   TCL_ERROR;..  p
c940: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
c950: 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  nX *)sqlite3_mal
c960: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43  loc(sizeof(TestC
c970: 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70  ollationX));.  p
c980: 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d  ->pCmp = objv[3]
c990: 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62  ;.  p->pDel = ob
c9a0: 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65  jv[4];.  p->inte
c9b0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54  rp = interp;.  T
c9c0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c9d0: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
c9e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
c9f0: 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pDel);..  rc = s
ca00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
ca10: 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54  llation_v2(db, T
ca20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ca30: 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20  v[2]), 16, .    
ca40: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
ca50: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
ca60: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
ca70: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
ca80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ca90: 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20  E_MISUSE ){.    
caa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cab0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
cac0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65  3_create_collate
cad0: 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20  _v2() failed to 
cae0: 64 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22  detect ".      "
caf0: 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64  an invalid encod
cb00: 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ing", (char*)0);
cb10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cb20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
cb30: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
cb40: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
cb50: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
cb60: 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45  objv[2]), SQLITE
cb70: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76  _UTF8, .      (v
cb80: 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65  oid *)p, testCre
cb90: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c  ateCollationCmp,
cba0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
cbb0: 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72  tionDel.  );.  r
cbc0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cbd0: 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71  ./*.** USAGE: sq
cbe0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
cbf0: 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45  ction_v2 DB NAME
cc00: 20 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43   NARG ENC ?SWITC
cc10: 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c  HES?.**.** Avail
cc20: 61 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72  able switches ar
cc30: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63  e:.**.**   -func
cc40: 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20      SCRIPT.**   
cc50: 2d 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a  -step    SCRIPT.
cc60: 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43  **   -final   SC
cc70: 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72  RIPT.**   -destr
cc80: 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70  oy SCRIPT.*/.typ
cc90: 65 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61  edef struct Crea
cca0: 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65  teFunctionV2 Cre
ccb0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73  ateFunctionV2;.s
ccc0: 74 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63  truct CreateFunc
ccd0: 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49  tionV2 {.  Tcl_I
cce0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
ccf0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b   Tcl_Obj *pFunc;
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66   /* Script for f
cd20: 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69  unction invocati
cd30: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
cd40: 2a 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20  *pStep;         
cd50: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70          /* Scrip
cd60: 74 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20  t for agg. step 
cd70: 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
cd80: 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b  Tcl_Obj *pFinal;
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67  /* Script for ag
cdb0: 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  g. finalization 
cdc0: 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
cdd0: 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f  Tcl_Obj *pDestro
cde0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
cdf0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63  /* Destructor sc
ce00: 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  ript */.};.stati
ce10: 63 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73  c void cf2Func(s
ce20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ce30: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
ce40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
ce50: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
ce60: 6f 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69  oid cf2Step(sqli
ce70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
ce80: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69  , int nArg, sqli
ce90: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67  te3_value **aArg
cea0: 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  ){.}.static void
ceb0: 20 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65   cf2Final(sqlite
cec0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  3_context *ctx){
ced0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
cee0: 66 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a  f2Destroy(void *
cef0: 70 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65  pUser){.  Create
cf00: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20  FunctionV2 *p = 
cf10: 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56  (CreateFunctionV
cf20: 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66  2 *)pUser;..  if
cf30: 28 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70  ( p->interp && p
cf40: 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->pDestroy ){.  
cf50: 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45    int rc = Tcl_E
cf60: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
cf70: 72 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c  rp, p->pDestroy,
cf80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
cf90: 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61  =TCL_OK ) Tcl_Ba
cfa0: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
cfb0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
cfc0: 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20   if( p->pFunc ) 
cfd0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cfe0: 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69  (p->pFunc); .  i
cff0: 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63  f( p->pStep ) Tc
d000: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d010: 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28  ->pStep); .  if(
d020: 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c   p->pFinal ) Tcl
d030: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
d040: 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28  >pFinal); .  if(
d050: 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54   p->pDestroy ) T
d060: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
d070: 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20  p->pDestroy); . 
d080: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
d090: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  ;.}.static int S
d0a0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
d0b0: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
d0c0: 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  n_v2(.  ClientDa
d0d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20  ta clientData,  
d0e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
d0f0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
d100: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d120: 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e 74  invoking TCL int
d130: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
d140: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d160: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d170: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d180: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
d1a0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
d1b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d1c0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
d1d0: 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *zFunc;.  int n
d1e0: 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b 0a  Arg;.  int enc;.
d1f0: 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e    CreateFunction
d200: 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  V2 *p;.  int i;.
d210: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74 72    int rc;..  str
d220: 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a 20  uct EncTable {. 
d230: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d240: 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e 63  Enc;.    int enc
d250: 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20 7b  ;.  } aEnc[] = {
d260: 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20 20  .    {"utf8",   
d270: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c 0a   SQLITE_UTF8 },.
d280: 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20 20      {"utf16",   
d290: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c 0a  SQLITE_UTF16 },.
d2a0: 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c 20      {"utf16le", 
d2b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7d  SQLITE_UTF16LE }
d2c0: 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65 22  ,.    {"utf16be"
d2d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
d2e0: 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c 20   },.    {"any", 
d2f0: 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20 7d      SQLITE_ANY }
d300: 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d 0a  ,.    {"0", 0 }.
d310: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
d320: 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d 3d  <5 || (objc%2)==
d330: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  0 ){.    Tcl_Wro
d340: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
d350: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e  , 1, objv, "DB N
d360: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57 49  AME NARG ENC SWI
d370: 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20 20  TCHES...");.    
d380: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d390: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
d3a0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
d3b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
d3c0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
d3d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d3e0: 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63 6c  R;.  zFunc = Tcl
d3f0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d400: 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
d410: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
d420: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
d430: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
d440: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
d450: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
d460: 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c  bjStruct(interp,
d470: 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c 20   objv[4], aEnc, 
d480: 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29 2c  sizeof(aEnc[0]),
d490: 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e 63   .          "enc
d4a0: 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63 29  oding", 0, &enc)
d4b0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d4c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d4d0: 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e 63    enc = aEnc[enc
d4e0: 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73 71  ].enc;..  p = sq
d4f0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d500: 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69  eof(CreateFuncti
d510: 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72 74  onV2));.  assert
d520: 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ( p );.  memset(
d530: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72 65  p, 0, sizeof(Cre
d540: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b  ateFunctionV2));
d550: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
d560: 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  nterp;..  for(i=
d570: 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29  5; i<objc; i+=2)
d580: 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74 63  {.    int iSwitc
d590: 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  h;.    const cha
d5a0: 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d 20  r *azSwitch[] = 
d5b0: 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65 70  {"-func", "-step
d5c0: 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d 64  ", "-final", "-d
d5d0: 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20 20  estroy", 0};.   
d5e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
d5f0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
d600: 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69 74   objv[i], azSwit
d610: 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30 2c  ch, "switch", 0,
d620: 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20 20   &iSwitch) ){.  
d630: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d640: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
d650: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d660: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
d670: 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 20  iSwitch ){.     
d680: 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75 6e   case 0: p->pFun
d690: 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  c = objv[i+1];  
d6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d6b0: 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74 65   case 1: p->pSte
d6c0: 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  p = objv[i+1];  
d6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d6e0: 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69 6e   case 2: p->pFin
d6f0: 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  al = objv[i+1]; 
d700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d710: 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65 73   case 3: p->pDes
d720: 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  troy = objv[i+1]
d730: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ;   break;.    }
d740: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 46  .  }.  if( p->pF
d750: 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20 3d  unc ) p->pFunc =
d760: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
d770: 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20  j(p->pFunc); .  
d780: 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20 70  if( p->pStep ) p
d790: 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44 75  ->pStep = Tcl_Du
d7a0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 53  plicateObj(p->pS
d7b0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
d7c0: 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69 6e  pFinal ) p->pFin
d7d0: 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  al = Tcl_Duplica
d7e0: 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c 29  teObj(p->pFinal)
d7f0: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
d800: 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74 72  troy ) p->pDestr
d810: 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  oy = Tcl_Duplica
d820: 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72 6f  teObj(p->pDestro
d830: 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y); ..  if( p->p
d840: 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72 52  Func ) Tcl_IncrR
d850: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63  efCount(p->pFunc
d860: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ); .  if( p->pSt
d870: 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  ep ) Tcl_IncrRef
d880: 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b  Count(p->pStep);
d890: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
d8a0: 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  l ) Tcl_IncrRefC
d8b0: 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b  ount(p->pFinal);
d8c0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74   .  if( p->pDest
d8d0: 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  roy ) Tcl_IncrRe
d8e0: 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72  fCount(p->pDestr
d8f0: 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73 71  oy); ..  rc = sq
d900: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d910: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75  ction_v2(db, zFu
d920: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 28  nc, nArg, enc, (
d930: 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20 20  void *)p, .     
d940: 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66 32   (p->pFunc ? cf2
d950: 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20 20  Func : 0),.     
d960: 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66 32   (p->pStep ? cf2
d970: 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20 20  Step : 0),.     
d980: 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63 66   (p->pFinal ? cf
d990: 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20 20  2Final : 0),.   
d9a0: 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20 20     cf2Destroy.  
d9b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d9c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
d9d0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
d9e0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
d9f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
da00: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
da10: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
da20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
da30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
da40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
da50: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
da60: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  oad_extension DB
da70: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
da80: 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OC?.*/.static in
da90: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
daa0: 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
dab0: 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ion(.  ClientDat
dac0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
dad0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
dae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
daf0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
db00: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
db10: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
db20: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
db30: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
db40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
db50: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
db60: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
db70: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
db80: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
db90: 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
dba0: 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  mdInfo;.  sqlite
dbb0: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
dbc0: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
dbd0: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
dbe0: 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a  har *zProc = 0;.
dbf0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
dc00: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
dc10: 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
dc20: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
dc30: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
dc40: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
dc50: 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20  FILE ?PROC?");. 
dc60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dc70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
dc80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
dc90: 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65  bjv[1]);.  zFile
dca0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
dcb0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
dcc0: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
dcd0: 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53  zProc = Tcl_GetS
dce0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
dcf0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63    }..  /* Extrac
dd00: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
dd10: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
dd20: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
dd30: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
dd40: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
dd50: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
dd60: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
dd70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
dd80: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
dd90: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
dda0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
ddb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ddc0: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
ddd0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
dde0: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
ddf0: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
de00: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
de10: 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c   Call the underl
de20: 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e  ying C function.
de30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
de40: 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a  urs, set rc to .
de50: 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61    ** TCL_ERROR a
de60: 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f  nd load any erro
de70: 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68  r string into th
de80: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49  e interpreter. I
de90: 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72  f no .  ** error
dea0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20   occurs, set rc 
deb0: 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a  to TCL_OK..  */.
dec0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ded0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
dee0: 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  N.  rc = SQLITE_
def0: 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20  ERROR;.  zErr = 
df00: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
df10: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
df20: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
df30: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20  xtension()");.  
df40: 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a 20 20 28  (void)zProc;.  (
df50: 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23 65 6c 73  void)zFile;.#els
df60: 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  e.  rc = sqlite3
df70: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
df80: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
df90: 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66  , &zErr);.#endif
dfa0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
dfb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
dfc0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
dfd0: 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20  , zErr ? zErr : 
dfe0: 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  "", TCL_VOLATILE
dff0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
e000: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
e010: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
e020: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
e030: 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65  ree(zErr);..  re
e040: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e050: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
e060: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
e070: 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45  ension DB-HANDLE
e080: 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63   ONOFF.*/.static
e090: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
e0a0: 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c  PI test_enable_l
e0b0: 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  oad(.  ClientDat
e0c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
e0d0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
e0e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e0f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
e100: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
e110: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
e120: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
e130: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
e140: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e150: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
e160: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
e170: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
e180: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
e190: 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
e1a0: 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  mdInfo;.  sqlite
e1b0: 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a  3 *db;.  char *z
e1c0: 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  Db;.  int onoff;
e1d0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
e1e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
e1f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e200: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e  1, objv, "DB-HAN
e210: 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20  DLE ONOFF");.   
e220: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e230: 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
e240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e250: 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74  v[1]);..  /* Ext
e260: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
e270: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
e280: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
e290: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
e2a0: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
e2b0: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
e2c0: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
e2d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e2e0: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
e2f0: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
e300: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
e310: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e320: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
e330: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
e340: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
e350: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
e360: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
e370: 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f 66   /* Get the onof
e380: 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  f parameter */. 
e390: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
e3a0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
e3b0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f  p, objv[2], &ono
e3c0: 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ff) ){.    retur
e3d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e3e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e3f0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
e400: 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ION.  Tcl_Append
e410: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e420: 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73  this build omits
e430: 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
e440: 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72  tension()");.  r
e450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e460: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
e470: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
e480: 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66  ension(db, onoff
e490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
e4a0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  OK;.#endif.}../*
e4b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
e4c0: 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53  te_abort.**.** S
e4d0: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63  hutdown the proc
e4e0: 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ess immediately.
e4f0: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20    This is not a 
e500: 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a  clean shutdown..
e510: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
e520: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
e530: 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69  the recoverabili
e540: 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ty of a database
e550: 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74   in.** the event
e560: 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72   of a program cr
e570: 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ash..*/.static i
e580: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
e590: 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20   sqlite_abort(. 
e5a0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
e5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
e5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
e5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
e5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
e600: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
e610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
e630: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
e640: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
e650: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
e660: 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69  t */.){.#if defi
e670: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20  ned(_MSC_VER).  
e680: 2f 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20 6f  /* We do this, o
e690: 74 68 65 72 77 69 73 65 20 74 68 65 20 74 65 73  therwise the tes
e6a0: 74 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74 68  t will halt with
e6b0: 20 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67 65   a popup message
e6c0: 0a 20 20 20 2a 20 74 68 61 74 20 77 65 20 68 61  .   * that we ha
e6d0: 76 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61 79  ve to click away
e6e0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 73 74   before the test
e6f0: 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a   will continue..
e700: 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f     */.  _set_abo
e710: 72 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c 20  rt_behavior( 0, 
e720: 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c  _CALL_REPORTFAUL
e730: 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78  T );.#endif.  ex
e740: 69 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65 72  it(255);.  asser
e750: 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20  t( interp==0 ); 
e760: 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61    /* This will a
e770: 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20  lways fail */.  
e780: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
e790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
e7a0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  owing routine is
e7b0: 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20   a user-defined 
e7c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f  SQL function who
e7d0: 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73  se purpose.** is
e7e0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
e7f0: 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29  ite_set_result()
e800: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
e810: 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71  void testFunc(sq
e820: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
e830: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
e840: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
e850: 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65  **argv){.  while
e860: 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
e870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
e880: 67 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  g0 = (char*)sqli
e890: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
e8a0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
e8b0: 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20   zArg0 ){.      
e8c0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
e8d0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e  rICmp(zArg0, "in
e8e0: 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t") ){.        s
e8f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
e900: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
e910: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
e920: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
e930: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
e940: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e  trICmp(zArg0,"in
e950: 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t64")==0 ){.    
e960: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e970: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
e980: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
e990: 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b  int64(argv[1]));
e9a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e9b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e9c0: 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d  zArg0,"string")=
e9d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e9e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
e9f0: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
ea00: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
ea10: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d  text(argv[1]), -
ea20: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  1,.            S
ea30: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ea40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ea50: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ea60: 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29  (zArg0,"double")
ea70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
ea80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
ea90: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71  uble(context, sq
eaa0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
eab0: 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  le(argv[1]));.  
eac0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
ead0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
eae0: 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  g0,"null")==0 ){
eaf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb00: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
eb10: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  text);.      }el
eb20: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
eb30: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c  rICmp(zArg0,"val
eb40: 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ue")==0 ){.     
eb50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
eb60: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
eb70: 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61   argv[sqlite3_va
eb80: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
eb90: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
eba0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
ebb0: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
ebc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ebd0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
ebe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63  ;.    }.    argc
ebf0: 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20   -= 2;.    argv 
ec00: 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  += 2;.  }.  retu
ec10: 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a  rn;..error_out:.
ec20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ec30: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22  _error(context,"
ec40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
ec50: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
ec60: 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e   ".      "int in
ec70: 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c  t64 string doubl
ec80: 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d  e null value", -
ec90: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  1);.}../*.** Usa
eca0: 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67  ge:   sqlite_reg
ecb0: 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
ecc0: 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a  ion  DB  NAME.**
ecd0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
ece0: 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69   test SQL functi
ecf0: 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  on on the databa
ed00: 73 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20  se DB under the 
ed10: 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74  name NAME..*/.st
ed20: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ed30: 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 67 69  TCLAPI test_regi
ed40: 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69  ster_func(.  voi
ed50: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
ed60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ed70: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
ed80: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
ed90: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
eda0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
edb0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
edc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
edd0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
ede0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
edf0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
ee00: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
ee10: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
ee20: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
ee30: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
ee40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ee50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
ee60: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
ee70: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
ee80: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46  , .       " DB F
ee90: 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30  UNCTION-NAME", 0
eea0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
eeb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
eec0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
eed0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
eee0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
eef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
ef00: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
ef10: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67  function(db, arg
ef20: 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[2], -1, SQLITE
ef30: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
ef40: 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29   testFunc, 0, 0)
ef50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
ef60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ef70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
ef80: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
ef90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
efa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
efb0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
efc0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
efd0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
efe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
eff0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f000: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f010: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20  lite3_finalize  
f020: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  STMT .**.** Fina
f030: 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74  lize a statement
f040: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
f050: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
f060: 4c 41 50 49 20 74 65 73 74 5f 66 69 6e 61 6c 69  LAPI test_finali
f070: 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ze(.  void * cli
f080: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f090: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f0a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f0b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f0c0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
f0d0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
f0e0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
f0f0: 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28   *db = 0;..  if(
f100: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
f110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f120: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
f130: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
f140: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
f150: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f160: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
f170: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
f180: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f190: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
f1a0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
f1b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
f1c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
f1d0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
f1e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
f1f0: 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
f200: 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53  db = StmtToDb(pS
f210: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tmt);.  }.  rc =
f220: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
f230: 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  e(pStmt);.  Tcl_
f240: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f250: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
f260: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
f270: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62  TATIC);.  if( db
f280: 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
f290: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
f2a0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
f2b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
f2c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
f2d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
f2e0: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
f2f0: 20 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52 45    STMT  CODE  RE
f300: 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65  SETFLAG.**.** Ge
f310: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  t the value of a
f320: 20 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72 20   status counter 
f330: 66 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e 74  from a statement
f340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f350: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
f360: 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a  st_stmt_status(.
f370: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f380: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f390: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f3a0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f3b0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f3c0: 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a  {.  int iValue;.
f3d0: 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d 20 30 2c    int i, op = 0,
f3e0: 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f   resetFlag;.  co
f3f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
f400: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e;.  sqlite3_stm
f410: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61  t *pStmt;..  sta
f420: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
f430: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
f440: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
f450: 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20  t op;.  } aOp[] 
f460: 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
f470: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
f480: 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20 53  LSCAN_STEP",   S
f490: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f4a0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20  _FULLSCAN_STEP  
f4b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f4c0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
f4d0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  T",            S
f4e0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f4f0: 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 20  _SORT           
f500: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f510: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
f520: 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 53  OINDEX",       S
f530: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f540: 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20 20  _AUTOINDEX      
f550: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f560: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
f570: 53 54 45 50 22 2c 20 20 20 20 20 20 20 20 20 53  STEP",         S
f580: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f590: 5f 56 4d 5f 53 54 45 50 20 20 20 20 20 20 20 20  _VM_STEP        
f5a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f5b0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50  E_STMTSTATUS_REP
f5c0: 52 45 50 41 52 45 22 2c 20 20 20 20 20 20 20 53  REPARE",       S
f5d0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f5e0: 5f 52 45 50 52 45 50 41 52 45 20 20 20 20 20 20  _REPREPARE      
f5f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f600: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e  E_STMTSTATUS_RUN
f610: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ",             S
f620: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f630: 5f 52 55 4e 20 20 20 20 20 20 20 20 20 20 20 20  _RUN            
f640: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
f650: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d  E_STMTSTATUS_MEM
f660: 55 53 45 44 22 2c 20 20 20 20 20 20 20 20 20 53  USED",         S
f670: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f680: 5f 4d 45 4d 55 53 45 44 20 20 20 20 20 20 20 20  _MEMUSED        
f690: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f   },.  };.  if( o
f6a0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
f6b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f6c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f6d0: 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52 20  "STMT PARAMETER 
f6e0: 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20 20  RESETFLAG");.   
f6f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f700: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f710: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f720: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f730: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f740: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d  _ERROR;.  zOpNam
f760: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
f770: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
f780: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
f790: 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  ze(aOp); i++){. 
f7a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 4f     if( strcmp(aO
f7b0: 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e  p[i].zName, zOpN
f7c0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
f7d0: 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b   op = aOp[i].op;
f7e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f7f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
f800: 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 20  =ArraySize(aOp) 
f810: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
f820: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f830: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
f840: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
f850: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
f860: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
f870: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f880: 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c  bjv[3], &resetFl
f890: 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ag) ) return TCL
f8a0: 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65  _ERROR;.  iValue
f8b0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
f8c0: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f 70  status(pStmt, op
f8d0: 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20  , resetFlag);.  
f8e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
f8f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
f900: 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b  IntObj(iValue));
f910: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f920: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
f930: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f940: 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20  CANSTATUS./*.** 
f950: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f960: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 20  stmt_scanstatus 
f970: 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73 74 61 74  STMT IDX.*/.stat
f980: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
f990: 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 73  LAPI test_stmt_s
f9a0: 63 61 6e 73 74 61 74 75 73 28 0a 20 20 76 6f 69  canstatus(.  voi
f9b0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f9c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f9d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f9e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f9f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
fa00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fa10: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
fa20: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
fa30: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
fa60: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a 20 20 63  argument */..  c
fa70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
fa80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
fa90: 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  zExplain;.  sqli
faa0: 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 3b  te3_int64 nLoop;
fab0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fac0: 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f 75 62 6c   nVisit;.  doubl
fad0: 65 20 72 45 73 74 3b 0a 20 20 69 6e 74 20 72 65  e rEst;.  int re
fae0: 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
faf0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
fb00: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
fb10: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
fb20: 20 49 44 58 22 29 3b 0a 20 20 20 20 72 65 74 75   IDX");.    retu
fb30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb40: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
fb50: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
fb60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
fb70: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
fb80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fb90: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
fba0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
fbb0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
fbc0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fbd0: 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20 3d 20 73  RROR;..  res = s
fbe0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
fbf0: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64  status(pStmt, id
fc00: 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  x, SQLITE_SCANST
fc10: 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a  AT_NLOOP, (void*
fc20: 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20  )&nLoop);.  if( 
fc30: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  res==0 ){.    Tc
fc40: 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
fc50: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
fc60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fc70: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fc80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fc90: 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d 31 29 29  bj("nLoop", -1))
fca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
fcb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
fcc0: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57  , pRet, Tcl_NewW
fcd0: 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f 6f 70 29  ideIntObj(nLoop)
fce0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
fcf0: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
fd00: 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54  Stmt, idx, SQLIT
fd10: 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49  E_SCANSTAT_NVISI
fd20: 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69  T, (void*)&nVisi
fd30: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  t);.    Tcl_List
fd40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fd50: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fd60: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 56 69 73  wStringObj("nVis
fd70: 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  it", -1));.    T
fd80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fd90: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
fda0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
fdb0: 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a 20 20 20  bj(nVisit));.   
fdc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
fdd0: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
fde0: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
fdf0: 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a  STAT_EST, (void*
fe00: 29 26 72 45 73 74 29 3b 0a 20 20 20 20 54 63 6c  )&rEst);.    Tcl
fe10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fe20: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
fe30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
fe40: 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20  "nEst", -1));.  
fe50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
fe60: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
fe70: 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  et, Tcl_NewDoubl
fe80: 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a 20 20 20  eObj(rEst));.   
fe90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
fea0: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
feb0: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
fec0: 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76 6f 69 64  STAT_NAME, (void
fed0: 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 54  *)&zName);.    T
fee0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fef0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
ff00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ff10: 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31 29 29 3b  j("zName", -1));
ff20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
ff30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
ff40: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
ff50: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
ff60: 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1));.    sqlite3
ff70: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
ff80: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
ff90: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58 50  ITE_SCANSTAT_EXP
ffa0: 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45  LAIN, (void*)&zE
ffb0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 54 63 6c  xplain);.    Tcl
ffc0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ffd0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
ffe0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
fff0: 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d 31 29 29  "zExplain", -1))
10000 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
10010 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
10020 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
10030 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70 6c 61 69  tringObj(zExplai
10040 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  n, -1));.    Tcl
10050 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10060 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
10070 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65  else{.    Tcl_Re
10080 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
10090 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
100a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
100b0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
100c0 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
100d0 5f 72 65 73 65 74 20 20 53 54 4d 54 0a 2a 2f 0a  _reset  STMT.*/.
100e0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
100f0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74  E_TCLAPI test_st
10100 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
10110 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  set(.  void * cl
10120 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10130 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10140 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10150 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10160 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10170 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
10180 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10190 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  t argument */.  
101a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
101b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
101c0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
101d0 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
101e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
101f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
10200 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10210 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10220 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10230 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10240 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
10250 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
10260 75 73 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  us_reset(pStmt);
10270 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10280 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
10290 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
102a0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 55 73  _SQLLOG./*.** Us
102b0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6f  age:  sqlite3_co
102c0 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a 2a 0a 2a  nfig_sqllog.**.*
102d0 2a 20 5a 65 72 6f 20 74 68 65 20 53 51 4c 49 54  * Zero the SQLIT
102e0 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
102f0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f  configuration.*/
10300 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10310 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
10320 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28 0a 20 20  onfig_sqllog(.  
10330 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10340 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10350 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10360 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10370 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10380 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
10390 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
103a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
103b0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
103c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
103d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
103e0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
103f0 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20 30 2c 20  NFIG_SQLLOG, 0, 
10400 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
10410 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
10420 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10430 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 6f 72 74  ite3_config_sort
10440 65 72 72 65 66 0a 2a 2a 0a 2a 2a 20 53 65 74 20  erref.**.** Set 
10450 74 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  the SQLITE_CONFI
10460 47 5f 53 4f 52 54 45 52 52 45 46 5f 53 49 5a 45  G_SORTERREF_SIZE
10470 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
10480 70 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ption.*/.static 
10490 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
104a0 49 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 6f  I test_config_so
104b0 72 74 65 72 72 65 66 28 0a 20 20 76 6f 69 64 20  rterref(.  void 
104c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
104d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
104e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
104f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10500 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
10510 20 69 56 61 6c 3b 0a 20 20 69 66 28 20 6f 62 6a   iVal;.  if( obj
10520 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
10530 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10540 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 1, objv, "N
10550 42 59 54 45 22 29 3b 0a 20 20 20 20 72 65 74 75  BYTE");.    retu
10560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10570 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
10580 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
10590 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 56 61 6c  , objv[1], &iVal
105a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
105b0 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
105c0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
105d0 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
105e0 49 5a 45 2c 20 69 56 61 6c 29 3b 0a 20 20 72 65  IZE, iVal);.  re
105f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10600 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 76 66 73  /*.** Usage: vfs
10610 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f 69 6e  _current_time_in
10620 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t64.**.** Return
10630 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
10640 6e 65 64 20 62 79 20 74 68 65 20 64 65 66 61 75  ned by the defau
10650 6c 74 20 56 46 53 27 73 20 78 43 75 72 72 65 6e  lt VFS's xCurren
10660 74 54 69 6d 65 49 6e 74 36 34 20 6d 65 74 68 6f  tTimeInt64 metho
10670 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10680 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76   SQLITE_TCLAPI v
10690 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  fsCurrentTimeInt
106a0 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
106b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
106c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
106d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
106e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
106f0 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20  [].){.  i64 t;. 
10700 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10710 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
10720 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
10730 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    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 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
10770 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10780 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74    pVfs->xCurrent
10790 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
107a0 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  &t);.  Tcl_SetOb
107b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
107c0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
107d0 6a 28 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(t));.  return 
107e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  TCL_OK;.}..#ifde
107f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10800 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10810 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10820 61 70 73 68 6f 74 5f 67 65 74 20 44 42 20 44 42  apshot_get DB DB
10830 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
10840 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
10850 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67   test_snapshot_g
10860 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
10870 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10880 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10890 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
108a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
108b0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
108c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
108d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
108e0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
108f0 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b   *pSnapshot = 0;
10900 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
10910 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
10920 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10930 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
10940 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
10950 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10960 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
10970 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10980 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10990 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
109a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
109b0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
109c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ring(objv[2]);..
109d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
109e0 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62 2c 20  napshot_get(db, 
109f0 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f  zName, &pSnapsho
10a00 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
10a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
10a20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10a30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10a40 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
10a50 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
10a60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10a70 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
10a80 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
10a90 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20 73 71  100];.    if( sq
10aa0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
10ab0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
10ac0 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f 74 29  zBuf, pSnapshot)
10ad0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10ae0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ROR;.    Tcl_Set
10af0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10b00 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10b10 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b 0a 20  bj(zBuf, -1));. 
10b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
10b30 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
10b40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
10b50 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
10b60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10b70 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10b80 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10b90 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 20 44  apshot_recover D
10ba0 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74  B DBNAME.*/.stat
10bb0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
10bc0 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68  LAPI test_snapsh
10bd0 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f  ot_recover(.  vo
10be0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
10bf0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10c00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10c10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10c20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10c30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
10c40 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a  3 *db;.  char *z
10c50 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Name;..  if( obj
10c60 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10c70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10c80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
10c90 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20  B DBNAME");.    
10ca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10cb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
10cc0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
10cd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
10ce0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
10cf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10d00 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f  ;.  zName = Tcl_
10d10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
10d20 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ]);..  rc = sqli
10d30 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63  te3_snapshot_rec
10d40 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  over(db, zName);
10d50 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
10d70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10d80 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
10d90 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
10da0 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
10db0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10dc0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
10dd0 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
10de0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  lt(interp);.  }.
10df0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10e00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10e10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
10e20 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  HOT */..#ifdef S
10e30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10e40 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67  PSHOT./*.** Usag
10e50 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  e: sqlite3_snaps
10e60 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44 42 4e 41  hot_open DB DBNA
10e70 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73  ME SNAPSHOT.*/.s
10e80 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10e90 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
10ea0 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 76 6f  pshot_open(.  vo
10eb0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
10ec0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10ed0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10ee0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10ef0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10f00 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
10f10 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a  3 *db;.  char *z
10f20 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
10f30 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
10f40 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  hot;..  if( objc
10f50 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
10f60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10f70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
10f80 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54   DBNAME SNAPSHOT
10f90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
10fa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10fb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
10fc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10fd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10fe0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10ff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d  CL_ERROR;.  zNam
11000 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
11010 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 53  g(objv[2]);.  pS
11020 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74  napshot = (sqlit
11030 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c  e3_snapshot*)sql
11040 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
11050 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
11060 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20 72 63  objv[3]));..  rc
11070 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73   = sqlite3_snaps
11080 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a 4e 61  hot_open(db, zNa
11090 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a  me, pSnapshot);.
110a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
110b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
110c0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
110d0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
110e0 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
110f0 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20  ame(rc), -1));. 
11100 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11110 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
11120 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
11130 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  t(interp);.  }. 
11140 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11150 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11160 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
11170 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
11180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
11190 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SHOT./*.** Usage
111a0 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
111b0 6f 74 5f 66 72 65 65 20 53 4e 41 50 53 48 4f 54  ot_free SNAPSHOT
111c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
111d0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
111e0 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28  t_snapshot_free(
111f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
11200 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
11210 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
11220 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
11230 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
11240 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  ){.  sqlite3_sna
11250 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
11260 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
11270 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11280 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11290 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53 48  1, objv, "SNAPSH
112a0 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OT");.    return
112b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
112c0 20 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73    pSnapshot = (s
112d0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a  qlite3_snapshot*
112e0 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74  )sqlite3TestText
112f0 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72  ToPtr(Tcl_GetStr
11300 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20  ing(objv[1]));. 
11310 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
11320 74 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74  t_free(pSnapshot
11330 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
11340 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
11350 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
11360 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
11370 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11380 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
11390 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
113a0 61 70 73 68 6f 74 5f 63 6d 70 20 53 4e 41 50 53  apshot_cmp SNAPS
113b0 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 0a 2a  HOT1 SNAPSHOT2.*
113c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
113d0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
113e0 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 0a 20 20  snapshot_cmp(.  
113f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11400 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11410 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11420 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11430 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11440 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 73 71 6c    int res;.  sql
11450 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
11460 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  1;.  sqlite3_sna
11470 70 73 68 6f 74 20 2a 70 32 3b 0a 20 20 69 66 28  pshot *p2;.  if(
11480 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11490 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
114a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
114b0 2c 20 22 53 4e 41 50 53 48 4f 54 31 20 53 4e 41  , "SNAPSHOT1 SNA
114c0 50 53 48 4f 54 32 22 29 3b 0a 20 20 20 20 72 65  PSHOT2");.    re
114d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
114e0 20 20 7d 0a 20 20 70 31 20 3d 20 28 73 71 6c 69    }.  p1 = (sqli
114f0 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71  te3_snapshot*)sq
11500 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
11510 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  tr(Tcl_GetString
11520 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 70 32  (objv[1]));.  p2
11530 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70   = (sqlite3_snap
11540 73 68 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73  shot*)sqlite3Tes
11550 74 54 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47  tTextToPtr(Tcl_G
11560 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
11570 29 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  ));.  res = sqli
11580 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70  te3_snapshot_cmp
11590 28 70 31 2c 20 70 32 29 3b 0a 20 20 54 63 6c 5f  (p1, p2);.  Tcl_
115a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
115b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
115c0 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75  bj(res));.  retu
115d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
115e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
115f0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
11600 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11610 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
11620 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
11630 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
11640 74 5f 62 6c 6f 62 20 44 42 20 44 42 4e 41 4d 45  t_blob DB DBNAME
11650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
11660 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
11670 74 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62  t_snapshot_get_b
11680 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
11690 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
116a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
116b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
116c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
116d0 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
116e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
116f0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
11700 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
11710 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20 30  t *pSnapshot = 0
11720 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
11730 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
11740 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11750 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
11760 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
11770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11780 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
11790 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
117a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
117b0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
117c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
117d0 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
117e0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
117f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11800 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62 2c  snapshot_get(db,
11810 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73 68   zName, &pSnapsh
11820 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ot);.  if( rc!=S
11830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11840 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
11850 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
11860 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
11870 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31  3ErrName(rc), -1
11880 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
11890 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
118a0 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  e{.    Tcl_SetOb
118b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
118c0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  .        Tcl_New
118d0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 6e  ByteArrayObj((un
118e0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 53 6e  signed char*)pSn
118f0 61 70 73 68 6f 74 2c 20 73 69 7a 65 6f 66 28 73  apshot, sizeof(s
11900 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 29  qlite3_snapshot)
11910 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
11920 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
11930 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ee(pSnapshot);. 
11940 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
11950 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
11960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
11970 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
11980 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11990 53 4e 41 50 53 48 4f 54 0a 20 20 2f 2a 0a 20 20  SNAPSHOT.  /*.  
119a0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
119b0 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f  3_snapshot_open_
119c0 62 6c 6f 62 20 44 42 20 44 42 4e 41 4d 45 20 53  blob DB DBNAME S
119d0 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74 69  NAPSHOT.*/.stati
119e0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
119f0 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  API test_snapsho
11a00 74 5f 6f 70 65 6e 5f 62 6c 6f 62 28 0a 20 20 76  t_open_blob(.  v
11a10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
11a20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
11a30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
11a40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
11a50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11a60 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11a70 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
11a80 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e 65  zName;.  unsigne
11a90 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20  d char *pBlob;. 
11aa0 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a 20 20 69   int nBlob;..  i
11ab0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
11ac0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11ad0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11ae0 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53  jv, "DB DBNAME S
11af0 4e 41 50 53 48 4f 54 22 29 3b 0a 20 20 20 20 72  NAPSHOT");.    r
11b00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11b10 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
11b20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11b30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11b40 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
11b50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11b60 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
11b70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
11b80 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 54 63 6c  );.  pBlob = Tcl
11b90 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
11ba0 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
11bb0 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 6e 42 6c  Blob);.  if( nBl
11bc0 6f 62 21 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  ob!=sizeof(sqlit
11bd0 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 29 7b 0a  e3_snapshot) ){.
11be0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11bf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
11c00 64 20 53 4e 41 50 53 48 4f 54 22 2c 20 30 29 3b  d SNAPSHOT", 0);
11c10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11c20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
11c30 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  = sqlite3_snapsh
11c40 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a 4e 61 6d  ot_open(db, zNam
11c50 65 2c 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70  e, (sqlite3_snap
11c60 73 68 6f 74 2a 29 70 42 6c 6f 62 29 3b 0a 20 20  shot*)pBlob);.  
11c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11c80 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
11c90 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11ca0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11cb0 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
11cc0 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
11cd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11ce0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
11cf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
11d00 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11d10 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
11d20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11d30 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
11d40 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
11d50 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 62  3_snapshot_cmp_b
11d60 6c 6f 62 20 53 4e 41 50 53 48 4f 54 31 20 53 4e  lob SNAPSHOT1 SN
11d70 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74 61 74 69  APSHOT2.*/.stati
11d80 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
11d90 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  API test_snapsho
11da0 74 5f 63 6d 70 5f 62 6c 6f 62 28 0a 20 20 76 6f  t_cmp_blob(.  vo
11db0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11dc0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11dd0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11de0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11df0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11e00 69 6e 74 20 72 65 73 3b 0a 20 20 75 6e 73 69 67  int res;.  unsig
11e10 6e 65 64 20 63 68 61 72 20 2a 70 31 3b 0a 20 20  ned char *p1;.  
11e20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
11e30 32 3b 0a 20 20 69 6e 74 20 6e 31 3b 0a 20 20 69  2;.  int n1;.  i
11e40 6e 74 20 6e 32 3b 0a 0a 20 20 69 66 28 20 6f 62  nt n2;..  if( ob
11e50 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
11e60 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11e70 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
11e80 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48  SNAPSHOT1 SNAPSH
11e90 4f 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OT2");.    retur
11ea0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11eb0 0a 0a 20 20 70 31 20 3d 20 54 63 6c 5f 47 65 74  ..  p1 = Tcl_Get
11ec0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
11ed0 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 31 29 3b 0a  (objv[1], &n1);.
11ee0 20 20 70 32 20 3d 20 54 63 6c 5f 47 65 74 42 79    p2 = Tcl_GetBy
11ef0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
11f00 62 6a 76 5b 32 5d 2c 20 26 6e 32 29 3b 0a 0a 20  bjv[2], &n2);.. 
11f10 20 69 66 28 20 6e 31 21 3d 73 69 7a 65 6f 66 28   if( n1!=sizeof(
11f20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11f30 29 20 7c 7c 20 6e 31 21 3d 6e 32 20 29 7b 0a 20  ) || n1!=n2 ){. 
11f40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11f50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
11f60 20 53 4e 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a   SNAPSHOT", 0);.
11f70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11f80 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 73  RROR;.  }..  res
11f90 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73   = sqlite3_snaps
11fa0 68 6f 74 5f 63 6d 70 28 28 73 71 6c 69 74 65 33  hot_cmp((sqlite3
11fb0 5f 73 6e 61 70 73 68 6f 74 2a 29 70 31 2c 20 28  _snapshot*)p1, (
11fc0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11fd0 2a 29 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74  *)p2);.  Tcl_Set
11fe0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11ff0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
12000 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
12010 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
12020 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
12030 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f  E_SNAPSHOT */../
12040 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
12050 74 65 33 5f 64 65 6c 65 74 65 5f 64 61 74 61 62  te3_delete_datab
12060 61 73 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2f 0a  ase FILENAME.*/.
12070 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 65 6c 65  int sqlite3_dele
12080 74 65 5f 64 61 74 61 62 61 73 65 28 63 6f 6e 73  te_database(cons
12090 74 20 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 69  t char*);   /* i
120a0 6e 20 74 65 73 74 5f 64 65 6c 65 74 65 2e 63 20  n test_delete.c 
120b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
120c0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
120d0 5f 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65  _delete_database
120e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
120f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12100 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12110 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12120 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12130 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
12140 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
12150 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  e;.  if( objc!=2
12160 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
12170 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12180 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 22   1, objv, "FILE"
12190 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
121a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
121b0 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
121c0 61 72 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  ar*)Tcl_GetStrin
121d0 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63  g(objv[1]);.  rc
121e0 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 6c 65 74   = sqlite3_delet
121f0 65 5f 64 61 74 61 62 61 73 65 28 7a 46 69 6c 65  e_database(zFile
12200 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
12210 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
12220 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12230 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
12240 63 29 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  c), -1));.  retu
12250 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12260 0a 2a 2a 20 55 73 61 67 65 3a 20 61 74 6f 6d 69  .** Usage: atomi
12270 63 5f 62 61 74 63 68 5f 77 72 69 74 65 20 50 41  c_batch_write PA
12280 54 48 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TH.*/.static int
12290 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
122a0 65 73 74 5f 61 74 6f 6d 69 63 5f 62 61 74 63 68  est_atomic_batch
122b0 5f 77 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a  _write(.  void *
122c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
122d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
122e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
122f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12300 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
12310 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 20 20 20 20   *zFile = 0;    
12320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12330 61 74 68 20 74 6f 20 66 69 6c 65 20 74 6f 20 74  ath to file to t
12340 65 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  est */.  sqlite3
12350 20 2a 64 62 20 3d 20 30 3b 20 20 20 20 20 20 20   *db = 0;       
12360 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12370 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12380 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
12390 46 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Fd = 0;         
123a0 20 2f 2a 20 53 51 4c 69 74 65 20 66 64 20 6f 70   /* SQLite fd op
123b0 65 6e 20 6f 6e 20 7a 46 69 6c 65 20 2a 2f 0a 20  en on zFile */. 
123c0 20 69 6e 74 20 62 52 65 73 20 3d 20 30 3b 20 20   int bRes = 0;  
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 73 75   /* Integer resu
123f0 6c 74 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d 61  lt of this comma
12400 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 64 63 20 3d  nd */.  int dc =
12410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12420 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
12430 65 2d 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e-characteristic
12440 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20  s mask */.  int 
12450 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12470 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 72 65  qlite3_open() re
12480 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
12490 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
124a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
124b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
124c0 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a 20 20  bjv, "PATH");.  
124d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
124e0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20  OR;.  }.  zFile 
124f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
12500 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 72 63 20  objv[1]);..  rc 
12510 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
12520 46 69 6c 65 2c 20 26 64 62 29 3b 0a 20 20 69 66  File, &db);.  if
12530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12540 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12550 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12560 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
12570 62 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  b), 0);.    sqli
12580 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
12590 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
125a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
125b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
125c0 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
125d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  , SQLITE_FCNTL_F
125e0 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f  ILE_POINTER, (vo
125f0 69 64 2a 29 26 70 46 64 29 3b 0a 20 20 64 63 20  id*)&pFd);.  dc 
12600 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pFd->pMethods-
12610 3e 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  >xDeviceCharacte
12620 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20 20  ristics(pFd);.  
12630 69 66 28 20 64 63 20 26 20 53 51 4c 49 54 45 5f  if( dc & SQLITE_
12640 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
12650 49 43 20 29 7b 0a 20 20 20 20 62 52 65 73 20 3d  IC ){.    bRes =
12660 20 31 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 53   1;.  }..  Tcl_S
12670 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12680 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
12690 6a 28 62 52 65 73 29 29 3b 0a 20 20 73 71 6c 69  j(bRes));.  sqli
126a0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
126b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
126c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
126d0 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
126e0 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a  mt  DB  STMT.**.
126f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  ** Return the ne
12700 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73  xt statment in s
12710 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 53 54  equence after ST
12720 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
12730 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
12740 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a  test_next_stmt(.
12750 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12760 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12770 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12780 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12790 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
127a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
127b0 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74   *pStmt;.  sqlit
127c0 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68  e3 *db = 0;.  ch
127d0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20  ar zBuf[50];..  
127e0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
127f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12800 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12810 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12820 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12830 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12840 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12850 30 29 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20  0), " DB STMT", 
12860 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12880 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
12890 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
128a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
128b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
128c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
128d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
128e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
128f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
12900 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
12910 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53   TCL_ERROR;.  pS
12920 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65  tmt = sqlite3_ne
12930 78 74 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d  xt_stmt(db, pStm
12940 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  t);.  if( pStmt 
12950 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
12960 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
12970 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
12980 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
12990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
129a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
129b0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
129c0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
129d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
129e0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
129f0 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
12a00 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
12a10 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54  urn true if STMT
12a20 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
12a30 65 72 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  er or a pointer 
12a40 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  to a statement.*
12a50 2a 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  * that is guaran
12a60 74 65 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68  teed to leave th
12a70 65 20 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64  e database unmod
12a80 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
12a90 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
12aa0 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61  PI test_stmt_rea
12ab0 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
12ac0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
12ad0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12ae0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
12af0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
12b00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
12b10 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
12b20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
12b30 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
12b40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12b50 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
12b60 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
12b70 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
12b80 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
12b90 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12ba0 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
12bb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12bc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
12bd0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
12be0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12bf0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
12c00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
12c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
12c20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
12c30 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
12c40 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
12c50 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
12c60 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29  wBooleanObj(rc))
12c70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12c80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
12c90 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
12ca0 5f 69 73 65 78 70 6c 61 69 6e 20 20 53 54 4d 54  _isexplain  STMT
12cb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 2c  .**.** Return 1,
12cc0 20 32 2c 20 6f 72 20 30 20 72 65 73 70 65 63 74   2, or 0 respect
12cd0 69 76 65 6c 79 20 69 66 20 53 54 4d 54 20 69 73  ively if STMT is
12ce0 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
12cf0 65 6d 65 6e 74 2c 20 61 6e 0a 2a 2a 20 45 58 50  ement, an.** EXP
12d00 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
12d10 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 61 6e 20  statement or an 
12d20 6f 72 64 69 6e 61 72 79 20 73 74 61 74 65 6d 65  ordinary stateme
12d30 6e 74 20 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74  nt or NULL point
12d40 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
12d50 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
12d60 74 65 73 74 5f 73 74 6d 74 5f 69 73 65 78 70 6c  test_stmt_isexpl
12d70 61 69 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ain(.  void * cl
12d80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12d90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12da0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12db0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12dc0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12dd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
12de0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
12df0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
12e00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12e10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
12e20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
12e30 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
12e40 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12e50 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12e60 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
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 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
12e90 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
12ea0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12eb0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
12ec0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
12ed0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
12ee0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78  qlite3_stmt_isex
12ef0 70 6c 61 69 6e 28 70 53 74 6d 74 29 3b 0a 20 20  plain(pStmt);.  
12f00 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12f10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
12f20 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
12f30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
12f40 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
12f50 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
12f60 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
12f70 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54  urn true if STMT
12f80 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70   is a non-NULL p
12f90 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
12fa0 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68 61  ement.** that ha
12fb0 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20 62  s been stepped b
12fc0 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c 65  ut not to comple
12fd0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
12fe0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
12ff0 49 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79  I test_stmt_busy
13000 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13010 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13020 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13030 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13040 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
13050 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
13060 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
13070 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
13080 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
13090 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
130a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
130b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
130c0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
130d0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
130e0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
130f0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
13100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13110 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
13120 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
13130 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13140 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
13150 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13160 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
13170 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53  te3_stmt_busy(pS
13180 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
13190 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
131a0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
131b0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
131c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
131d0 2a 2a 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f  ** Usage:  uses_
131e0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54  stmt_journal  ST
131f0 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
13200 74 72 75 65 20 69 66 20 53 54 4d 54 20 75 73 65  true if STMT use
13210 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  s a statement jo
13220 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13230 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
13240 50 49 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  PI uses_stmt_jou
13250 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  rnal(.  void * c
13260 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13270 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13280 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
13290 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
132a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
132b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
132c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
132d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
132e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
132f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
13300 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
13310 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
13320 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
13330 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  , 0), " STMT", 0
13340 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13350 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
13360 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
13370 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
13380 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
13390 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
133a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
133b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
133c0 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
133d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
133e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
133f0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64  wBooleanObj(((Vd
13400 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65  be *)pStmt)->use
13410 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a  sStmtJournal));.
13420 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13430 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
13440 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
13450 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
13460 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
13470 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
13480 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
13490 41 50 49 20 74 65 73 74 5f 72 65 73 65 74 28 0a  API test_reset(.
134a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
134b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
134c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
134d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
134e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
134f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
13500 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
13510 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
13520 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
13530 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13540 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13550 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
13560 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
13570 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13580 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
13590 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
135a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
135b0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
135c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
135d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
135e0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
135f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13600 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
13610 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
13620 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26  );.  if( pStmt &
13630 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  & sqlite3TestErr
13640 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
13650 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
13660 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
13680 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
13690 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
136a0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
136b0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a  TCL_STATIC);./*.
136c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
136d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
136e0 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72  ;.  }.*/.  retur
136f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13700 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
13710 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20  e3_expired STMT 
13720 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
13730 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c  UE if a recompil
13740 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
13750 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d  tement is recomm
13760 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ended..*/.static
13770 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
13780 50 49 20 74 65 73 74 5f 65 78 70 69 72 65 64 28  PI test_expired(
13790 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
137a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
137b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
137c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
137d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
137e0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
137f0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
13800 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  D.  sqlite3_stmt
13810 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f   *pStmt;.  if( o
13820 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
13830 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13840 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
13850 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13860 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13870 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13880 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
13890 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
138a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
138b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
138c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
138d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
138e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
138f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
13900 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
13910 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13920 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
13930 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78  anObj(sqlite3_ex
13940 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a  pired(pStmt)));.
13950 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
13960 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
13970 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
13980 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
13990 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54  gs FROMSTMT TOST
139a0 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  MT.**.** Transfe
139b0 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66  r all bindings f
139c0 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65  rom FROMSTMT ove
139d0 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73  r to TOSTMT.*/.s
139e0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
139f0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 72 61  _TCLAPI test_tra
13a00 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f  nsfer_bind(.  vo
13a10 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13a20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13a30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13a40 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13a50 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
13a60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a70 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
13a80 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13a90 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20  mt1, *pStmt2;.  
13aa0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
13ab0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13ac0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
13ad0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
13ae0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
13af0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
13b00 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
13b10 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20  0), " FROM-STMT 
13b20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  TO-STMT", 0);.  
13b30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13b40 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
13b50 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
13b60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13b70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
13b80 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43  tmt1)) return TC
13b90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
13ba0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13bb0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13bc0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
13bd0 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54  Stmt2)) return T
13be0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
13bf0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13c00 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
13c10 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
13c20 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
13c30 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32  gs(pStmt1,pStmt2
13c40 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  )));.#endif.  re
13c50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13c60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
13c70 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
13c80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
13c90 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
13ca0 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
13cb0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
13cc0 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
13cd0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
13ce0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
13cf0 50 49 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28  PI test_changes(
13d00 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
13d10 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
13d20 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
13d30 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
13d40 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
13d50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13d60 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
13d70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13d80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13d90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
13da0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
13db0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
13dc0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
13dd0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
13de0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13df0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
13e00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13e10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13e20 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13e30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13e40 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
13e50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
13e60 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
13e70 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20  hanges(db)));.  
13e80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
13e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
13ea0 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64  the "static_bind
13eb0 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72  _value" that var
13ec0 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64  iables are bound
13ed0 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20   to when.** the 
13ee0 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73  FLAG option of s
13ef0 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22  qlite3_bind is "
13f00 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69  static".*/.stati
13f10 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73  c char *sqlite_s
13f20 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
13f30 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
13f40 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
13f50 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a  ind_nbyte = 0;..
13f60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
13f70 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20  lite3_bind  VM  
13f80 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47  IDX  VALUE  FLAG
13f90 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65  S.**.** Sets the
13fa0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44   value of the ID
13fb0 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65 20  X-th occurrence 
13fc0 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
13fd0 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
13fe0 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
13ff0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
14000 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
14010 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
14020 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
14030 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
14040 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
14050 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
14060 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
14070 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
14080 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
14090 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
140a0 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
140b0 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
140c0 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
140d0 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
140e0 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
140f0 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ade.  If FLAGS==
14100 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20  "blob10" then a 
14110 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64  VALUE is ignored
14120 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65  .** an a 10-byte
14130 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79   blob "abc\000xy
14140 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65  z\000pq" is inse
14150 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
14160 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
14170 49 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76  I test_bind(.  v
14180 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
14190 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
141a0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
141b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
141c0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
141d0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
141e0 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
141f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14200 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
14210 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
14220 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
14230 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
14240 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
14250 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
14260 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
14270 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
14280 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14290 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
142a0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
142b0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
142c0 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
142d0 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e   VM IDX VALUE (n
142e0 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61  ull|static|norma
142f0 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  l)\"", 0);.    r
14300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14310 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
14320 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
14330 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d  , argv[1], &pStm
14340 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
14350 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
14360 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
14370 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  argv[2], &idx) )
14380 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14390 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
143a0 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d  argv[4],"null")=
143b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
143c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
143d0 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
143e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
143f0 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
14400 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
14410 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
14420 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
14430 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
14440 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29  nd_value, -1, 0)
14450 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
14460 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74  rcmp(argv[4],"st
14470 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30  atic-nbytes")==0
14480 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14490 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
144a0 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74  Stmt, idx, sqlit
144b0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
144c0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
144f0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
14500 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  byte, 0);.  }els
14510 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
14520 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d  v[4],"normal")==
14530 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
14540 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
14550 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76  pStmt, idx, argv
14560 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [3], -1, SQLITE_
14570 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
14580 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
14590 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29  rgv[4],"blob10")
145a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
145b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
145c0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61  t(pStmt, idx, "a
145d0 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
145e0 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41  , 10, SQLITE_STA
145f0 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TIC);.  }else{. 
14600 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14610 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68  ult(interp, "4th
14620 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
14630 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c   be ".        "\
14640 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61  "null\" or \"sta
14650 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61  tic\" or \"norma
14660 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  l\"", 0);.    re
14670 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14680 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
14690 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
146a0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
146b0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
146c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
146d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68  if( rc ){.    ch
146e0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
146f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14700 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
14710 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
14720 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
14730 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14740 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72   zBuf, sqlite3Er
14750 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
14760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14770 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
14780 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
14790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
147a0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67  UTF16./*.** Usag
147b0 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
147c0 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ate <db ptr> <ut
147d0 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
147e0 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
147f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
14800 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
14810 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
14820 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c  the correct coll
14830 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63  ation.** sequenc
14840 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  e callback when 
14850 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
14860 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
14870 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
14880 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
14890 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
148a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
148b0 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c  gisters the coll
148c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22  ation sequence "
148d0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a  test_collate".**
148e0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68   with database h
148f0 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20  andle <db>. The 
14900 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
14910 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f  must be a list o
14920 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65  f three.** boole
14930 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68  an values. If th
14940 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65 2c  e first is true,
14950 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20   then a version 
14960 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
14970 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  is.** registered
14980 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
14990 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75  he second is tru
149a0 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20  e, a version is 
149b0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a  registered for.*
149c0 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  * UTF-16le, if t
149d0 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75 65  he third is true
149e0 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72  , a UTF-16be ver
149f0 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
14a00 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76  e..** Previous v
14a10 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f  ersions of test_
14a20 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65  collate are dele
14a30 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ted..**.** The c
14a40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14a50 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69  e test_collate i
14a60 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
14a70 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20   calling the.** 
14a80 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
14a90 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
14aa0 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63  est_collate <enc
14ab0 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a  > <lhs> <rhs>".*
14ac0 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61  *.** The <lhs> a
14ad0 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65  nd <rhs> are the
14ae0 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e   two values bein
14af0 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f  g compared, enco
14b00 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  ded in UTF-8..**
14b10 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d   The <enc> param
14b20 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f  eter is the enco
14b30 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c  ding of the coll
14b40 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  ation function t
14b50 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  hat.** SQLite se
14b60 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20  lected to call. 
14b70 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  The TCL test scr
14b80 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ipt implements t
14b90 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c  he.** "test_coll
14ba0 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a  ate" proc..**.**
14bb0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
14bc0 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77  will only work w
14bd0 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70 72 65  ith one interpre
14be0 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61  ter at a time, a
14bf0 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20  s the.** interp 
14c00 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77  pointer to use w
14c10 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74  hen evaluating t
14c20 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
14c30 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54   stored in.** pT
14c40 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
14c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
14c60 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c  Interp* pTestCol
14c70 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74  lateInterp;.stat
14c80 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
14c90 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ate_func(.  void
14ca0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
14cb0 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  A, const void *z
14cc0 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e  A,.  int nB, con
14cd0 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
14ce0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d   Tcl_Interp *i =
14cf0 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
14d00 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e  erp;.  int encin
14d10 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
14d20 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20 69 6e  _INT(pCtx);.  in
14d30 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  t res;.  int n;.
14d40 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14d50 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62   *pVal;.  Tcl_Ob
14d60 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54  j *pX;..  pX = T
14d70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14d80 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
14d90 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
14da0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20  efCount(pX);..  
14db0 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b  switch( encin ){
14dc0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14dd0 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c  _UTF8:.      Tcl
14de0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14df0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
14e00 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
14e10 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  -8",-1));.      
14e20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14e30 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a  SQLITE_UTF16LE:.
14e40 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
14e50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14e60 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
14e70 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
14e80 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
14e90 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
14ea0 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20  TE_UTF16BE:.    
14eb0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14ec0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
14ed0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14ee0 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29  ("UTF-16BE",-1))
14ef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14f00 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
14f10 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
14f20 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ..  sqlite3Begin
14f30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14f40 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
14f50 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 69  ValueNew(0);.  i
14f60 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 73  f( pVal ){.    s
14f70 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14f80 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20  r(pVal, nA, zA, 
14f90 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
14fa0 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
14fb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
14fc0 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
14fd0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14fe0 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
14ff0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
15000 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
15010 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
15020 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
15030 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
15040 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20  r(pVal, nB, zB, 
15050 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
15060 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
15070 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
15080 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
15090 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
150a0 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
150b0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
150c0 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
150d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
150e0 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
150f0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
15100 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pVal);.  }.  sql
15110 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15120 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  loc();..  Tcl_Ev
15130 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
15140 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
15150 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
15160 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15170 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
15180 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
15190 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
151a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
151b0 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 6c  TCLAPI test_coll
151c0 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
151d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
151e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
151f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15200 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15210 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15220 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
15230 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15240 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
15250 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
15260 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
15270 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  ;.  pTestCollate
15280 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  Interp = interp;
15290 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
152a0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
152b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
152c0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
152d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
152e0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
152f0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
15300 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15310 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
15320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
15330 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
15340 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
15350 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
15360 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
15370 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
15380 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76 61  )SQLITE_UTF8, va
15390 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
153a0 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72 63  unc:0);.  if( rc
153b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
153c0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
153d0 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28 20 54  Utf16;.    if( T
153e0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
153f0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
15400 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
15410 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
15420 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d  _ERROR;.    rc =
15430 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
15440 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
15450 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
15460 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20  LITE_UTF16LE, . 
15470 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
15480 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 4c   *)SQLITE_UTF16L
15490 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  E, val?test_coll
154a0 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20  ate_func:0);.   
154b0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
154c0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
154d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
154e0 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  4], &val) ) retu
154f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23  rn TCL_ERROR;..#
15500 69 66 20 30 0a 20 20 20 20 69 66 28 20 73 71 6c  if 0.    if( sql
15510 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
15520 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
15530 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b  te3_iMallocFail+
15540 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  +;.    }.#endif.
15550 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15560 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
15570 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
15580 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
15590 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
155a0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
155b0 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61   -1, "test_colla
155c0 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
155d0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
155e0 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73  ;.    zUtf16 = s
155f0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
15600 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
15610 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69  16NATIVE);.    i
15620 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15630 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
15640 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
15670 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
15680 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53 51 4c  (db, zUtf16, SQL
15690 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20  ITE_UTF16BE, .  
156a0 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
156b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
156c0 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
156d0 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a  _func:0);.    }.
156e0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
156f0 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  Free(pVal);.    
15700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15710 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
15720 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
15730 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
15740 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
15750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15760 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51  .  .  if( rc!=SQ
15770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
15780 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15790 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
157a0 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
157b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
157c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
157d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f  rn TCL_OK;..bad_
157e0 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65  args:.  Tcl_Appe
157f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15800 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15810 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15820 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
15830 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
15840 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75  ], 0), " <DB> <u
15850 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
15860 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20  utf16be>", 0);. 
15870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15880 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
15890 65 3a 20 61 64 64 5f 74 65 73 74 5f 75 74 66 31  e: add_test_utf1
158a0 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20 3c 64 62  6bin_collate <db
158b0 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20   ptr>.**.** Add 
158c0 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c 61 74 69  a utf-16 collati
158d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
158e0 64 20 22 75 74 66 31 36 62 69 6e 22 20 74 6f 20  d "utf16bin" to 
158f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
15900 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 63 6f 6c  handle. This col
15910 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15920 63 6f 6d 70 61 72 65 73 20 61 72 67 75 6d 65 6e  compares argumen
15930 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ts in the same w
15940 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 62 75 69  ay as the.** bui
15950 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20  lt-in collation 
15960 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a 73 74 61  "binary"..*/.sta
15970 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 74 66  tic int test_utf
15980 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75  16bin_collate_fu
15990 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  nc(.  void *pCtx
159a0 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e  , .  int nA, con
159b0 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
159c0 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nB, const voi
159d0 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e 74 20 6e  d *zB.){.  int n
159e0 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e  Cmp = (nA>nB ? n
159f0 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e 74 20 72  B : nA);.  int r
15a00 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 41 2c 20  es = memcmp(zA, 
15a10 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20 69 66 28  zB, nCmp);.  if(
15a20 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
15a30 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65 74 75 72  nA - nB;.  retur
15a40 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
15a50 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
15a60 49 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  I test_utf16bin_
15a70 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
15a80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
15a90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15aa0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15ab0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
15ac0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
15ad0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
15ae0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
15af0 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =2 ) goto bad_ar
15b00 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
15b10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
15b20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15b30 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
15b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15b60 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
15b70 28 64 62 2c 20 22 75 74 66 31 36 62 69 6e 22 2c  (db, "utf16bin",
15b80 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 30   SQLITE_UTF16, 0
15b90 2c 20 0a 20 20 20 20 20 20 74 65 73 74 5f 75 74  , .      test_ut
15ba0 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66  f16bin_collate_f
15bb0 75 6e 63 0a 20 20 29 3b 0a 20 20 69 66 28 20 73  unc.  );.  if( s
15bc0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15bd0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
15be0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15bf0 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
15c00 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
15c10 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  :.  Tcl_WrongNum
15c20 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
15c30 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72  objv, "DB");.  r
15c40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
15c60 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  he collation nee
15c70 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ded callback is 
15c80 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20  invoked, record 
15c90 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20  the name of .** 
15ca0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
15cb0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
15cc0 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f   here.  The reco
15cd0 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e  rded name is lin
15ce0 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20  ked.** to a TCL 
15cf0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65  variable and use
15d00 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
15d10 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65  hat the requeste
15d20 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e  d collation.** n
15d30 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ame is correct..
15d40 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
15d50 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
15d60 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61  200];.static cha
15d70 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  r *pzNeededColla
15d80 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f  tion = zNeededCo
15d90 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a  llation;.../*.**
15da0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   Called when a c
15db0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
15dc0 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65  e is needed.  Re
15dd0 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a  gistered using.*
15de0 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  * sqlite3_collat
15df0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a  ion_needed16()..
15e00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
15e10 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
15e20 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70  ed_cb(.  void *p
15e30 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  Ctx, .  sqlite3 
15e40 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  *db,.  int eText
15e50 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Rep,.  const voi
15e60 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e  d *pName.){.  in
15e70 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  t enc = ENC(db);
15e80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
15e90 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28   *z;.  for(z = (
15ea0 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30  char*)pName, i=0
15eb0 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b  ; *z || z[1]; z+
15ec0 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29  +){.    if( *z )
15ed0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
15ee0 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d  n[i++] = *z;.  }
15ef0 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  .  zNeededCollat
15f00 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  ion[i] = 0;.  sq
15f10 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
15f20 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  lation(.      db
15f30 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
15f40 2c 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54  , ENC(db), SQLIT
15f50 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63  E_INT_TO_PTR(enc
15f60 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  ), test_collate_
15f70 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  func);.}../*.** 
15f80 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
15f90 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44  collate_needed D
15fa0 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
15fb0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
15fc0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
15fd0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
15fe0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
15ff0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16000 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16010 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16020 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
16030 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
16040 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
16050 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
16060 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
16070 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16080 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16090 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
160a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
160b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
160c0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20  on_needed16(db, 
160d0 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  0, test_collate_
160e0 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e  needed_cb);.  zN
160f0 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30  eededCollation[0
16100 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  ] = 0;.  if( sql
16110 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16120 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
16130 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16140 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
16150 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
16160 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16170 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
16180 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
16190 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
161a0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
161b0 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f    add_alignment_
161c0 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20  test_collations 
161d0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77   DB.**.** Add tw
161e0 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  o new collating 
161f0 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65  sequences to the
16200 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a   database DB.**.
16210 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69  **     utf16_ali
16220 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31  gned.**     utf1
16230 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a  6_unaligned.**.*
16240 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
16250 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74   sequences use t
16260 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
16270 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a  er as BINARY..**
16280 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
16290 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65  ence is that the
162a0 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63   utf16_aligned c
162b0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
162c0 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64  ence is declared
162d0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
162e0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66  _UTF16_ALIGNED f
162f0 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  lag..** Both col
16300 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
16310 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75   increment the u
16320 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63  naligned utf16 c
16330 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76  ounter.** whenev
16340 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74  er they see a st
16350 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
16360 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20   on an odd byte 
16370 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61  boundary..*/.sta
16380 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65  tic int unaligne
16390 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
163a0 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
163b0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
163c0 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
163d0 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
163e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
163f0 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
16400 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
16410 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
16420 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
16430 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
16440 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65  nKey2;.  if( nKe
16450 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53  y1>0 && 1==(1&(S
16460 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
16470 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c  (pKey1))) ) unal
16480 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
16490 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b  nter++;.  if( nK
164a0 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey2>0 && 1==(1&(
164b0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
164c0 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61  T(pKey2))) ) una
164d0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
164e0 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20  unter++;.  rc = 
164f0 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
16500 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
16510 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
16520 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
16530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16540 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  .}.static int SQ
16550 4c 49 54 45 5f 54 43 4c 41 50 49 20 61 64 64 5f  LITE_TCLAPI add_
16560 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
16570 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69  ollations(.  voi
16580 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16590 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
165a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
165b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
165c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
165d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
165e0 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20  ( objc>=2 ){.   
165f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
16600 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16610 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16620 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
16630 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
16640 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
16650 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
16660 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53  16_unaligned", S
16670 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20  QLITE_UTF16, .  
16680 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
16690 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20  ntCollFunc);.   
166a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
166b0 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
166c0 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53  tf16_aligned", S
166d0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
166e0 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  NED, .        0,
166f0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
16700 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nc);.  }.  retur
16710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
16720 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
16730 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
16740 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55  F16) */../*.** U
16750 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66  sage: add_test_f
16760 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e  unction <db ptr>
16770 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
16780 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a  > <utf16be>.**.*
16790 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
167a0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
167b0 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65  that SQLite sele
167c0 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  cts the correct 
167d0 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  user.** function
167e0 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
167f0 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
16800 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
16810 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
16820 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
16830 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
16840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
16850 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72  isters up to thr
16860 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
16870 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
16880 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69  .** "test_functi
16890 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73  on" with databas
168a0 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20  e handle <db>.  
168b0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
168c0 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75  gument is.** tru
168d0 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
168e0 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69  n of test_functi
168f0 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
16900 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
16910 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74  he.** third is t
16920 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
16930 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
16940 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
16950 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74  e fourth is.** t
16960 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
16970 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
16980 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20  able.  Previous 
16990 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74  versions of.** t
169a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65  est_function are
169b0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
169c0 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  The user functio
169d0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
169e0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20   by calling the 
169f0 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
16a00 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
16a10 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e  est_function <en
16a20 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20  c> <arg>".**.** 
16a30 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f  Where <enc> is o
16a40 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46  ne of UTF-8, UTF
16a50 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45  -16LE or UTF16BE
16a60 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74  , and <arg> is t
16a70 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67  he.** single arg
16a80 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
16a90 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
16aa0 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
16ab0 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54  rned by.** the T
16ac0 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65  CL script is use
16ad0 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  d as the return 
16ae0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c  value of the SQL
16af0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a   function. It.**
16b00 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51   is passed to SQ
16b10 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31  Lite using UTF-1
16b20 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20  6BE for a UTF-8 
16b30 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  test_function(),
16b40 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20   UTF-8.** for a 
16b50 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75  UTF-16LE test_fu
16b60 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54  nction(), and UT
16b70 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d  F-16LE for an im
16b80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
16b90 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46  t.** prefers UTF
16ba0 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65  -16BE..*/.#ifnde
16bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
16bc0 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
16bd0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
16be0 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
16bf0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
16c00 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
16c10 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
16c20 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
16c30 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
16c40 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
16c50 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
16c60 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
16c70 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
16c80 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
16c90 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
16ca0 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
16cb0 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
16cc0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16cd0 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
16ce0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
16cf0 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
16d00 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16d10 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
16d20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
16d30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
16d40 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
16d50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
16d60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
16d70 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
16d80 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
16d90 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
16da0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
16db0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
16dc0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
16dd0 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f  _text(pCtx, Tcl_
16de0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
16df0 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c  interp), -1, SQL
16e00 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16e10 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
16e20 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
16e30 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
16e40 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
16e50 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
16e60 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
16e70 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
16e80 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
16e90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
16ea0 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
16eb0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
16ec0 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6be(pVal),.     
16ed0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
16ee0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
16ef0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
16f00 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
16f10 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
16f20 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
16f30 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
16f40 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
16f50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
16f60 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
16f70 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
16f80 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
16f90 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
16fa0 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
16fb0 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
16fc0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
16fd0 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
16fe0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
16ff0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
17000 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
17010 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
17020 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
17030 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
17040 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
17050 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d  bj("UTF-16LE", -
17060 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
17070 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
17080 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
17090 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
170a0 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
170b0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
170c0 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
170d0 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
170e0 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
170f0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
17100 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
17110 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
17120 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
17130 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
17140 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
17150 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
17160 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
17170 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
17180 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17190 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63  ult_text(pCtx,(c
171a0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
171b0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
171c0 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
171d0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
171e0 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
171f0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
17200 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
17210 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
17220 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
17230 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
17240 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
17250 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
17260 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
17270 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
17280 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
17290 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
172a0 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
172b0 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
172c0 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
172d0 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
172e0 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
172f0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
17300 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
17310 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
17320 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
17330 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
17340 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b  UTF-16BE", -1));
17350 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
17360 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
17370 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
17380 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
17390 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
173a0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
173b0 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
173c0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
173d0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
173e0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
173f0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
17400 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
17410 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
17420 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
17430 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
17440 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
17450 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
17460 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
17470 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
17480 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c  text16(pCtx, sql
17490 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
174a0 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
174b0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
174c0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
174d0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
174e0 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
174f0 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
17500 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
17510 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
17520 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17530 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74  ult_text16le(pCt
17540 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
17550 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
17560 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
17570 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
17580 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17590 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pVal);.}.#endif
175a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
175b0 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20  UTF16 */.static 
175c0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
175d0 49 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  I test_function(
175e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
175f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17600 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17610 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17620 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17630 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
17640 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
17650 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
17660 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62  t val;..  if( ob
17670 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64  jc!=5 ) goto bad
17680 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
17690 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
176a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
176b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
176c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
176d0 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  R;..  if( TCL_OK
176e0 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
176f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17700 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29  objv[2], &val) )
17710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17720 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
17730 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
17740 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
17750 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
17760 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
17770 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
17780 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
17790 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  utf8, 0, 0);.  }
177a0 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
177b0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
177c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
177d0 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
177e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
177f0 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
17800 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
17810 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
17820 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
17830 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
17840 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
17850 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
17860 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a  utf16le, 0, 0);.
17870 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
17880 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
17890 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
178a0 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29  objv[4], &val) )
178b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
178c0 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
178d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
178e0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
178f0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
17900 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
17910 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  BE, .        int
17920 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
17930 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30  on_utf16be, 0, 0
17940 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
17950 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67   TCL_OK;.bad_arg
17960 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
17970 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17980 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17990 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
179a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
179b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
179c0 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
179d0 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
179e0 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64  16be>", 0);.#end
179f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
17a00 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
17a10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
17a20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
17a40 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20  est_errstr <err 
17a50 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  code>.**.** Test
17a60 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73   that the englis
17a70 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e  h language strin
17a80 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f  g equivalents fo
17a90 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  r sqlite error c
17aa0 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65  odes.** are sane
17ab0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
17ac0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  is an integer re
17ad0 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71  presenting an sq
17ae0 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  lite error code.
17af0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
17b00 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20  s a list of two 
17b10 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74  elements, the st
17b20 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
17b30 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72  ion of the.** er
17b40 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65  ror code and the
17b50 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   english languag
17b60 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a  e explanation..*
17b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
17b80 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
17b90 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  errstr(.  void *
17ba0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17bb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17bc0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17bd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17be0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
17bf0 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69   *zCode;.  int i
17c00 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
17c10 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
17c20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
17c30 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72  1, objv, "<error
17c40 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20   code>");.  }.. 
17c50 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74   zCode = Tcl_Get
17c60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
17c70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
17c80 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
17c90 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72   0==strcmp(t1Err
17ca0 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65  orName(i), zCode
17cb0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
17cc0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
17cd0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
17ce0 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c  qlite3ErrStr(i),
17cf0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
17d00 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17d10 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f  sage:    breakpo
17d20 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  int.**.** This r
17d30 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f  outine exists fo
17d40 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20  r one purpose - 
17d50 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61  to provide a pla
17d60 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62  ce to put a.** b
17d70 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47  reakpoint with G
17d80 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74  DB that can be t
17d90 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54  riggered using T
17da0 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73  CL code.  The us
17db0 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73  e.** for this is
17dc0 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c   when a particul
17dd0 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e  ar test fails on
17de0 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74   (say) the 1485t
17df0 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  h iteration..** 
17e00 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20  In the TCL test 
17e10 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61  script, we can a
17e20 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  dd code like thi
17e30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20  s:.**.**     if 
17e40 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b  {$i==1485} break
17e50 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  point.**.** Then
17e60 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65   run testfixture
17e70 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
17e80 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68   and wait for th
17e90 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a  e breakpoint to.
17ea0 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61  ** fire.  Then a
17eb0 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70  dditional breakp
17ec0 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74  oints can be set
17ed0 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74   to trace down t
17ee0 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69  he bug..*/.stati
17ef0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
17f00 41 50 49 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  API test_breakpo
17f10 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
17f20 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
17f30 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
17f40 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
17f50 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
17f60 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
17f70 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17f90 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
17fa0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
17fb0 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
17fc0 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
17fd0 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
17fe0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
17ff0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
18000 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
18010 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18020 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
18030 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
18040 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
18050 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
18060 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
18070 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
18080 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
18090 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
180a0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
180b0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
180c0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
180d0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
180e0 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
180f0 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
18100 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18110 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
18120 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
18130 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  zeroblob(.  void
18140 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18150 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18160 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18170 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18180 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18190 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
181a0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
181b0 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  int n;.  int rc;
181c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
181d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
181e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
181f0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49  1, objv, "STMT I
18200 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  DX N");.    retu
18210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18220 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18230 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18240 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18250 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18260 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18270 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18280 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18290 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
182a0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
182b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
182c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
182d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
182e0 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
182f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
18300 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
18310 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78  oblob(pStmt, idx
18320 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , n);.  if( sqli
18330 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
18340 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
18350 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
18360 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18380 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
183a0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
183b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
183c0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
183d0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20 53 54  d_zeroblob64  ST
183e0 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54  MT IDX N.**.** T
183f0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
18400 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20  bind_zeroblob64 
18410 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
18420 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
18430 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58  tatement..** IDX
18440 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
18450 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
18460 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
18470 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
18480 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
18490 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c  N-byte zero-fill
184a0 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77  ed BLOB to the w
184b0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
184c0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
184d0 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 7a  LAPI test_bind_z
184e0 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20 76 6f 69  eroblob64(.  voi
184f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18500 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18510 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18520 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18530 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18540 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18550 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
18560 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 3b 0a   Tcl_WideInt n;.
18570 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
18580 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
18590 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
185a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
185b0 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b  , "STMT IDX N");
185c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
185d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
185e0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
185f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18600 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18610 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
18620 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18630 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18640 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18650 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
18660 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18670 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
18680 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
18690 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29  rp, objv[3], &n)
186a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
186b0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
186c0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
186d0 6f 62 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c  ob64(pStmt, idx,
186e0 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   n);.  if( sqlit
186f0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
18700 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
18710 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
18720 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18740 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
18750 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18760 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
18770 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
18780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18790 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
187a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
187b0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
187c0 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20  _bind_int  STMT 
187d0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
187e0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
187f0 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63  ind_int interfac
18800 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
18810 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18820 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
18830 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
18840 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
18850 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
18860 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
18870 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nds a 32-bit int
18880 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
18890 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
188a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
188b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
188c0 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  nd_int(.  void *
188d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
188e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
188f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18900 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18910 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18920 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18930 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
18940 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
18950 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
18960 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
18970 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18980 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18990 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
189a0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
189b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
189c0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
189d0 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
189e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
189f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18a00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18a10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18a20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18a30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18a40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18a50 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18a60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18a70 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
18a80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18a90 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18aa0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18ab0 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
18ac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18ad0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
18ae0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
18af0 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
18b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18b10 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18b20 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
18b30 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18b40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18b60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18b70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
18b80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18b90 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18ba0 69 6e 74 61 72 72 61 79 5f 61 64 64 72 20 20 49  intarray_addr  I
18bb0 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65  NT  ....**.** Re
18bc0 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
18bd0 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65   of a C-language
18be0 20 61 72 72 61 79 20 6f 66 20 33 32 2d 62 69 74   array of 32-bit
18bf0 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a   integers..**.**
18c00 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
18c10 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
18c20 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
18c30 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70  ().  Call this p
18c40 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a  rocedure once.**
18c50 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
18c60 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  ts in order to r
18c70 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20  elease memory.  
18c80 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  Each call to thi
18c90 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f  s procedure.** o
18ca0 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
18cb0 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f  evious array..*/
18cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
18cd0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
18ce0 6e 74 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  ntarray_addr(.  
18cf0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18d00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18d10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18d20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18d30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18d40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
18d50 63 20 69 6e 74 20 2a 70 20 3d 20 30 3b 0a 0a 20  c int *p = 0;.. 
18d60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
18d70 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  p = 0;.  if(
18d80 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70   objc>1 ){.    p
18d90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
18da0 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a  c( sizeof(p[0])*
18db0 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20  (objc-1) );.    
18dc0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
18dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18de0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63   for(i=0; i<objc
18df0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
18e00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18e10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18e20 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29 20  jv[1+i], &p[i]) 
18e30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
18e50 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20      p = 0;.     
18e60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18e70 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
18e80 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53   }.  }  .  Tcl_S
18e90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18ea0 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
18eb0 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69  ntObj((sqlite3_i
18ec0 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75  nt64)p));.  retu
18ed0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
18ee0 2a 2a 20 55 73 61 67 65 3a 20 20 20 69 6e 74 61  ** Usage:   inta
18ef0 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20 20  rray_addr  INT  
18f00 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
18f10 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
18f20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72  a C-language arr
18f30 61 79 20 6f 66 20 33 32 2d 62 69 74 20 69 6e 74  ay of 32-bit int
18f40 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  egers..**.** Spa
18f50 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  ce to hold the a
18f60 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
18f70 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20   from malloc(). 
18f80 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65   Call this proce
18f90 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74  dure once.** wit
18fa0 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69  h no arguments i
18fb0 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61  n order to relea
18fc0 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68  se memory.  Each
18fd0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72   call to this pr
18fe0 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77  ocedure.** overw
18ff0 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
19000 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  us array..*/.sta
19010 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
19020 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 36 34  CLAPI test_int64
19030 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20 76 6f  array_addr(.  vo
19040 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19050 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19060 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19070 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19080 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19090 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
190a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
190b0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
190c0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20  _free(p);.  p = 
190d0 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  0;.  if( objc>1 
190e0 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
190f0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
19100 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29  f(p[0])*(objc-1)
19110 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   );.    if( p==0
19120 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19130 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ROR;.    for(i=0
19140 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29  ; i<objc-1; i++)
19150 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65  {.      Tcl_Wide
19160 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  Int v;.      if(
19170 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
19180 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19190 62 6a 76 5b 31 2b 69 5d 2c 20 26 76 29 20 29 7b  bjv[1+i], &v) ){
191a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
191b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
191c0 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    p = 0;.       
191d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
191e0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
191f0 20 70 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 7d   p[i] = v;.    }
19200 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65 74  .  }  .  Tcl_Set
19210 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
19220 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
19230 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  Obj((sqlite3_int
19240 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e  64)p));.  return
19250 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
19260 20 55 73 61 67 65 3a 20 20 20 64 6f 75 62 6c 65   Usage:   double
19270 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20  array_addr  INT 
19280 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72   ....**.** Retur
19290 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
192a0 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72   a C-language ar
192b0 72 61 79 20 6f 66 20 64 6f 75 62 6c 65 73 2e 0a  ray of doubles..
192c0 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
192d0 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73  old the array is
192e0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
192f0 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74  alloc().  Call t
19300 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e  his procedure on
19310 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72  ce.** with no ar
19320 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  guments in order
19330 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
19340 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ry.  Each call t
19350 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  o this procedure
19360 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
19370 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61  he previous arra
19380 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19390 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
193a0 65 73 74 5f 64 6f 75 62 6c 65 61 72 72 61 79 5f  est_doublearray_
193b0 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
193c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
193d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
193e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
193f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19400 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
19410 0a 20 20 73 74 61 74 69 63 20 64 6f 75 62 6c 65  .  static double
19420 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69   *p = 0;..  sqli
19430 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
19440 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
19450 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
19460 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
19470 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
19480 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
19490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
194a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
194b0 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
194c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 54  ++){.      if( T
194d0 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
194e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
194f0 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29 20 29 7b  [1+i], &p[i]) ){
19500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19510 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
19520 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    p = 0;.       
19530 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19540 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
19550 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65 74  .  }  .  Tcl_Set
19560 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
19570 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
19580 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  Obj((sqlite3_int
19590 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e  64)p));.  return
195a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
195b0 20 55 73 61 67 65 3a 20 20 20 74 65 78 74 61 72   Usage:   textar
195c0 72 61 79 5f 61 64 64 72 20 20 54 45 58 54 20 2e  ray_addr  TEXT .
195d0 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ...**.** Return 
195e0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  the address of a
195f0 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72 61   C-language arra
19600 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a 2a  y of strings..**
19610 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
19620 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20 6f  d the array is o
19630 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
19640 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69  loc().  Call thi
19650 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65  s procedure once
19660 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75  .** with no argu
19670 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74  ments in order t
19680 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
19690 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
196a0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a  this procedure.*
196b0 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
196c0 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e   previous array.
196d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
196e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
196f0 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64 72  t_textarray_addr
19700 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19710 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19720 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19730 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19740 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19750 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
19760 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b  tatic int n = 0;
19770 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
19780 2a 70 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  *p = 0;..  for(i
19790 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 73 71  =0; i<n; i++) sq
197a0 6c 69 74 65 33 5f 66 72 65 65 28 70 5b 69 5d 29  lite3_free(p[i])
197b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
197c0 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
197d0 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
197e0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
197f0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
19800 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
19810 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
19820 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19830 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
19840 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
19850 20 20 20 70 5b 69 5d 20 3d 20 73 71 6c 69 74 65     p[i] = sqlite
19860 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
19870 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19880 6a 76 5b 31 2b 69 5d 29 29 3b 0a 20 20 20 20 7d  jv[1+i]));.    }
19890 0a 20 20 7d 0a 20 20 6e 20 3d 20 6f 62 6a 63 2d  .  }.  n = objc-
198a0 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  1;.  Tcl_SetObjR
198b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
198c0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
198d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
198e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
198f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
19900 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
19910 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54  bind_int64  STMT
19920 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
19930 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
19940 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72  bind_int64 inter
19950 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
19960 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
19970 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
19980 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
19990 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
199a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
199b0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
199c0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
199d0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
199e0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
199f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
19a00 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
19a10 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
19a20 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19a30 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19a40 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19a50 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19a60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19a70 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19a80 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
19a90 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76  .  Tcl_WideInt v
19aa0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
19ab0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
19ac0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19ad0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19ae0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19af0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
19b00 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19b10 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
19b20 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
19b30 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
19b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19b50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
19b60 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
19b70 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19b80 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
19b90 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
19ba0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
19bb0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
19bc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
19bd0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
19be0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
19bf0 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
19c00 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19c10 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
19c20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19c30 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
19c40 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
19c50 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
19c60 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
19c70 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
19c80 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
19c90 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
19ca0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19cb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
19cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19cf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
19d00 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19d10 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
19d20 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
19d30 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
19d40 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
19d50 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
19d60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
19d70 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
19d80 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
19d90 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
19da0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
19db0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
19dc0 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
19dd0 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
19de0 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
19df0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
19e00 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
19e10 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  nd_double(.  voi
19e20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19e30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19e40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19e50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19e60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
19e70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19e80 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
19e90 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20 3d 20   double value = 
19ea0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  0;.  int rc;.  c
19eb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b  onst char *zVal;
19ec0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
19ed0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
19ee0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
19ef0 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
19f00 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63  Name of the spec
19f10 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ial floating poi
19f20 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
19f30 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70  unsigned int iUp
19f40 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20  per;   /* Upper 
19f50 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75  32 bits */.    u
19f60 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77  nsigned int iLow
19f70 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33  er;   /* Lower 3
19f80 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53  2 bits */.  } aS
19f90 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20  pecialFp[] = {. 
19fa0 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20     {  "NaN",    
19fb0 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78    0x7fffffff, 0x
19fc0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
19fd0 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30  {  "SNaN",     0
19fe0 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  x7ff7ffff, 0xfff
19ff0 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
1a000 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66  "-NaN",     0xff
1a010 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
1a020 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53  ff },.    {  "-S
1a030 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66  NaN",    0xfff7f
1a040 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
1a050 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22  },.    {  "+Inf"
1a060 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30  ,     0x7ff00000
1a070 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
1a080 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20      {  "-Inf",  
1a090 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30     0xfff00000, 0
1a0a0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
1a0b0 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20   {  "Epsilon",  
1a0c0 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x00000000, 0x00
1a0d0 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
1a0e0 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38   "-Epsilon", 0x8
1a0f0 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  0000000, 0x00000
1a100 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e  001 },.    {  "N
1a110 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38  aN0",     0x7ff8
1a120 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
1a130 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
1a140 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30  0",    0xfff8000
1a150 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
1a160 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
1a170 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1a180 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a190 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a1a0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a1b0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
1a1c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1a1d0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
1a1e0 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
1a1f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a200 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1a210 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1a220 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a230 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a240 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1a250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a260 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1a270 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1a280 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
1a290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a2a0 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74  ..  /* Intercept
1a2b0 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e   the string "NaN
1a2c0 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  " and generate a
1a2d0 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69   NaN value for i
1a2e0 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65  t..  ** All othe
1a2f0 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61  r strings are pa
1a300 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
1a310 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
1a320 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c  mObj()..  ** Tcl
1a330 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
1a340 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72  j() should under
1a350 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20  stand "NaN" but 
1a360 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20  some versions.  
1a370 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  ** contain a bug
1a380 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20  ..  */.  zVal = 
1a390 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a3a0 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[3]);.  for(i=
1a3b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65  0; i<sizeof(aSpe
1a3c0 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
1a3d0 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69  SpecialFp[0]); i
1a3e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
1a3f0 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69  cmp(aSpecialFp[i
1a400 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d  ].zName, zVal)==
1a410 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a420 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20  e3_uint64 x;.   
1a430 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46     x = aSpecialF
1a440 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20  p[i].iUpper;.   
1a450 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20     x <<= 32;.   
1a460 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c     x |= aSpecial
1a470 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20  Fp[i].iLower;.  
1a480 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1a490 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a  of(value)==8 );.
1a4a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
1a4b0 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20  zeof(x)==8 );.  
1a4c0 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75      memcpy(&valu
1a4d0 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20  e, &x, 8);.     
1a4e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a4f0 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
1a500 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
1a510 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
1a520 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  0]) &&.         
1a530 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
1a540 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a550 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b  v[3], &value) ){
1a560 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a570 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
1a580 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
1a590 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
1a5a0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
1a5b0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1a5c0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
1a5d0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
1a5e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a5f0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
1a600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a610 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a620 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1a630 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a640 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1a650 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
1a660 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
1a670 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
1a680 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
1a690 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
1a6a0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
1a6b0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
1a6c0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
1a6d0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
1a6e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
1a6f0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
1a700 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
1a710 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
1a720 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1a730 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  API test_bind_nu
1a740 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
1a750 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a760 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a770 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a780 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a790 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1a7a0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1a7b0 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
1a7c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1a7d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a7e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a7f0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a800 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1a810 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a820 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1a830 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
1a840 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  N", 0);.    retu
1a850 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a860 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1a870 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a880 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a890 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1a8a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a8b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1a8c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1a8d0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
1a8e0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
1a8f0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
1a900 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
1a910 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
1a920 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1a930 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
1a940 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
1a950 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1a960 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1a970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a990 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
1a9a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a9b0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1a9c0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20  ite3_bind_text  
1a9d0 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
1a9e0 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
1a9f0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
1aa00 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20  text interface. 
1aa10 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
1aa20 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
1aa30 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
1aa40 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
1aa50 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
1aa60 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
1aa70 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
1aa80 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
1aa90 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
1aaa0 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
1aab0 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
1aac0 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
1aad0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1aae0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
1aaf0 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a  d_text(.  void *
1ab00 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ab10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ab20 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ab30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ab40 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1ab50 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1ab60 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
1ab70 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
1ab80 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
1ab90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
1aba0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1abb0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1abc0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1abd0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1abe0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1abf0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1ac00 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
1ac10 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
1ac20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ac30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ac40 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1ac50 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1ac60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ac70 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1ac80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ac90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1aca0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1acb0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
1acc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1acd0 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68  R;.  value = (ch
1ace0 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
1acf0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1ad00 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20  [3], &bytes);.  
1ad10 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1ad20 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1ad30 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
1ad40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ad50 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
1ad60 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
1ad70 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
1ad80 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52  bytes, SQLITE_TR
1ad90 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20  ANSIENT);.  if( 
1ada0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1adb0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
1adc0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
1add0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ade0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
1adf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
1ae00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ae10 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
1ae20 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
1ae30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ae40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
1ae50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ae60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1ae70 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
1ae80 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54  6 ?-static? STMT
1ae90 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
1aea0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
1aeb0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1aec0 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  16 interface.  S
1aed0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
1aee0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
1aef0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
1af00 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
1af10 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
1af20 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
1af30 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
1af40 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53   UTF-16 string S
1af50 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
1af60 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
1af70 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
1af80 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
1af90 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1afa0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
1afb0 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
1afc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1afd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1afe0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1aff0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b000 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1b010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1b020 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
1b030 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1b040 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
1b050 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
1b060 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1b070 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
1b080 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53  d*) = (objc==6?S
1b090 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c  QLITE_STATIC:SQL
1b0a0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1b0b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74    Tcl_Obj *oStmt
1b0c0 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
1b0d0 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  4];.  Tcl_Obj *o
1b0e0 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  N       = objv[o
1b0f0 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-3];.  Tcl_Ob
1b100 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62  j *oString  = ob
1b110 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63  jv[objc-2];.  Tc
1b120 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20  l_Obj *oBytes   
1b130 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
1b140 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1b150 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20  & objc!=6){.    
1b160 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b170 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1b180 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1b190 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
1b1a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1b1b0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
1b1c0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
1b1d0 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
1b1e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b1f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1b200 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1b210 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b220 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74  g(oStmt), &pStmt
1b230 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b240 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1b250 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1b260 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20  terp, oN, &idx) 
1b270 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b280 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
1b290 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
1b2a0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74  ArrayFromObj(oSt
1b2b0 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  ring, 0);.  if( 
1b2c0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1b2d0 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73  j(interp, oBytes
1b2e0 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1b2f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1b300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
1b310 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  nd_text16(pStmt,
1b320 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61   idx, (void *)va
1b330 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c  lue, bytes, xDel
1b340 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1b350 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1b360 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
1b370 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
1b380 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1b390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b3a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b3b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b3c0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1b3d0 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
1b3e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b3f0 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   }..#endif /* SQ
1b400 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1b410 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1b420 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b430 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
1b440 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63  nd_blob ?-static
1b450 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  ? STMT N DATA BY
1b460 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
1b470 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
1b480 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20  blob interface. 
1b490 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
1b4a0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
1b4b0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
1b4c0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
1b4d0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
1b4e0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
1b4f0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
1b500 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77   a BLOB to the w
1b510 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c  ildcard.  The BL
1b520 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74 65  OB is BYTES byte
1b530 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.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 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
1b570 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b580 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b590 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b5a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b5b0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1b5c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1b5d0 20 20 69 6e 74 20 6c 65 6e 2c 20 69 64 78 3b 0a    int len, idx;.
1b5e0 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
1b5f0 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
1b600 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
1b610 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20  destructor_type 
1b620 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
1b630 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a  LITE_TRANSIENT;.
1b640 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1b650 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20  & objc!=6 ){.   
1b660 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b670 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1b680 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b690 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
1b6a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1b6b0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
1b6c0 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20  , " STMT N DATA 
1b6d0 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
1b6e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b6f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
1b700 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73  c==6 ){.    xDes
1b710 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
1b720 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a  _STATIC;.    obj
1b730 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  v++;.  }..  if( 
1b740 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1b750 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1b760 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1b770 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1b780 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1b790 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1b7a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1b7b0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
1b7c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1b7d0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
1b7e0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1b7f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
1b800 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63   &len);.  if( Tc
1b810 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1b820 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1b830 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
1b840 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1b850 69 66 28 20 62 79 74 65 73 3e 6c 65 6e 20 29 7b  if( bytes>len ){
1b860 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32  .    char zBuf[2
1b870 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
1b880 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1b890 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 0a 20 20  (zBuf), zBuf,.  
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 25     "cannot use %
1b8c0 64 20 62 6c 6f 62 20 62 79 74 65 73 2c 20 68 61  d blob bytes, ha
1b8d0 76 65 20 25 64 22 2c 20 62 79 74 65 73 2c 20 6c  ve %d", bytes, l
1b8e0 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  en);.    Tcl_App
1b8f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b900 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a 20 20 20  , zBuf, -1);.   
1b910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b920 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
1b930 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b940 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
1b950 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74  ue, bytes, xDest
1b960 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73  ructor);.  if( s
1b970 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1b980 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
1b990 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
1b9a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b9b0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
1b9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1b9d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b9e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
1b9f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ba00 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1ba10 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
1ba20 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  ount  STMT.**.**
1ba30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ba40 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20  er of wildcards 
1ba50 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  in the given sta
1ba60 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
1ba70 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1ba80 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  API test_bind_pa
1ba90 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20  rameter_count(. 
1baa0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1bab0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1bac0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1bad0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1bae0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1baf0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1bb00 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1bb10 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1bb20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1bb30 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1bb40 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1bb50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bb60 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
1bb70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bb80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bb90 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1bba0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bbb0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
1bbc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1bbd0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1bbe0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1bbf0 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
1bc00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1bc10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1bc20 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
1bc30 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
1bc40 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a  me  STMT  N.**.*
1bc50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1bc60 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c  e of the Nth wil
1bc70 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72 73  dcard.  The firs
1bc80 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e  t wildcard is 1.
1bc90 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  .** An empty str
1bca0 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 20  ing is returned 
1bcb0 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
1bcc0 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20 77  ange or if the w
1bcd0 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61  ildcard.** is na
1bce0 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  meless..*/.stati
1bcf0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1bd00 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  API test_bind_pa
1bd10 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
1bd20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1bd30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1bd40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1bd50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1bd60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bd70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1bd80 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
1bd90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1bda0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1bdb0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1bdc0 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
1bdd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bde0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1bdf0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1be00 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1be10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1be20 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1be30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1be40 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1be50 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1be60 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
1be70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1be80 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1be90 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
1bea0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1beb0 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
1bec0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
1bed0 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
1bee0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bef0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bf00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
1bf10 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
1bf20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
1bf30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1bf40 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
1bf50 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
1bf60 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
1bf70 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
1bf80 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
1bf90 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1bfa0 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
1bfb0 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
1bfc0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1bfd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1bfe0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1bff0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c000 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c010 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1c020 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1c030 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c040 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1c050 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1c060 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a  , "STMT NAME");.
1c070 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c080 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1c090 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1c0a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c0b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c0c0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c0d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1c0e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c0f0 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
1c100 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20  NewIntObj(.     
1c110 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
1c120 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
1c130 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69  Stmt,Tcl_GetStri
1c140 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20  ng(objv[2])).   
1c150 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72    ).  );.  retur
1c160 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c170 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1c180 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
1c190 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74  gs STMT.**.*/.st
1c1a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c1b0 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6c 65 61  TCLAPI test_clea
1c1c0 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f  r_bindings(.  vo
1c1d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c1e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c1f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c200 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c210 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c220 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c230 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1c240 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1c250 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1c260 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
1c270 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
1c280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c290 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c2a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c2b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c2c0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c2d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c2e0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c2f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c300 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
1c310 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
1c320 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1c330 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c340 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1c350 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c  lite3_sleep MILL
1c360 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74  ISECONDS.*/.stat
1c370 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1c380 4c 41 50 49 20 74 65 73 74 5f 73 6c 65 65 70 28  LAPI test_sleep(
1c390 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c3a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c3b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c3c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c3d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c3e0 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20  ){.  int ms;..  
1c3f0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c400 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1c410 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1c420 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
1c430 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DS");.    return
1c440 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c450 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1c460 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c470 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b  objv[1], &ms) ){
1c480 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c490 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1c4a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c4b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1c4c0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65  Obj(sqlite3_slee
1c4d0 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72  p(ms)));.  retur
1c4e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c4f0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c500 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1c510 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
1c520 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
1c530 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1c540 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1c550 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
1c560 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
1c570 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
1c580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c590 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1c5a0 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20  st_ex_errcode(. 
1c5b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c5c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c5d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c5e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c5f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c600 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1c610 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1c620 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1c630 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c640 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c650 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c660 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c670 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c680 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
1c690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c6a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1c6b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1c6c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c6d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c6e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1c6f0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1c700 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1c710 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54  errcode(db);.  T
1c720 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c730 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1c740 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1c750 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1c760 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1c770 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
1c780 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20  rrcode DB.**.** 
1c790 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e  Return the strin
1c7a0 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
1c7b0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1c7c0 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1c7d0 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  I.** error code.
1c7e0 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52   e.g. "SQLITE_ER
1c7f0 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ROR"..*/.static 
1c800 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1c810 49 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  I test_errcode(.
1c820 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c830 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c840 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c850 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c860 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c870 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1c880 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1c890 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c8a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c8b0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c8c0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c8d0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c8e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c8f0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
1c900 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c910 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1c920 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1c930 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c940 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c950 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1c960 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1c970 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1c980 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
1c990 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c9a0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1c9b0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
1c9c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c9d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1c9e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
1c9f0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
1ca00 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
1ca10 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1ca20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
1ca30 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
1ca40 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
1ca50 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
1ca60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1ca70 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1ca80 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
1ca90 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1caa0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1cab0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1cac0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1cad0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1cae0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1caf0 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20  t char *zErr;.. 
1cb00 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1cb10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cb20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cb30 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cb40 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1cb50 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cb60 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
1cb70 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1cb80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1cb90 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1cba0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1cbb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1cbc0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1cbd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
1cbe0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
1cbf0 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f  rmsg(db);.  Tcl_
1cc00 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1cc10 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1cc20 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29  ngObj(zErr, -1))
1cc30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1cc40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1cc50 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67  e:   test_errmsg
1cc60 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  16 DB.**.** Retu
1cc70 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72  rns the UTF-16 r
1cc80 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
1cc90 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
1cca0 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ge string for th
1ccb0 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
1ccc0 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63   sqlite3_* API c
1ccd0 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62  all. This is a b
1cce0 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74  yte array object
1ccf0 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20   at the TCL .** 
1cd00 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e  level, and it in
1cd10 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20  cludes the 0x00 
1cd20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  0x00 terminator 
1cd30 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
1cd40 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31   of the.** UTF-1
1cd50 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  6 string..*/.sta
1cd60 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1cd70 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 6d 73  CLAPI test_errms
1cd80 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  g16(.  void * cl
1cd90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1cda0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cdb0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1cdc0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cdd0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1cde0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1cdf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1ce00 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45    const void *zE
1ce10 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rr;.  const char
1ce20 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   *z;.  int bytes
1ce30 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
1ce40 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1ce50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ce60 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ce70 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ce80 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1ce90 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1cea0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1ceb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1cec0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ced0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1cee0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1cef0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1cf00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1cf10 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
1cf20 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64  lite3_errmsg16(d
1cf30 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  b);.  if( zErr )
1cf40 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a  {.    z = zErr;.
1cf50 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b      for(bytes=0;
1cf60 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62   z[bytes] || z[b
1cf70 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d  ytes+1]; bytes+=
1cf80 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  2){}.  }.  Tcl_S
1cf90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1cfa0 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
1cfb0 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79  rrayObj(zErr, by
1cfc0 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  tes));.#endif /*
1cfd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1cfe0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1cff0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d000 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
1d010 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79  repare DB sql by
1d020 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a  tes ?tailvar?.**
1d030 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
1d040 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
1d050 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1d060 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
1d070 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
1d080 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
1d090 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
1d0a0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
1d0b0 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
1d0c0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
1d0d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
1d0e0 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
1d0f0 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
1d100 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
1d110 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1d120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1d130 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1d140 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
1d150 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1d160 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d170 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d180 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d190 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1d1a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1d1b0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
1d1c0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
1d1d0 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
1d1e0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1d1f0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1d200 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1d210 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1d220 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1d230 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1d240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d250 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d260 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d270 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d280 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d290 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1d2a0 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1d2b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d2c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1d2d0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1d2e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d2f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1d300 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1d310 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1d320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d330 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
1d340 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1d350 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1d360 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
1d370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d380 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1d390 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
1d3a0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
1d3b0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
1d3c0 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74   0);.  Tcl_Reset
1d3d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1d3e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1d3f0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
1d400 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
1d410 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1d420 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
1d430 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
1d440 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
1d450 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
1d460 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71   (int)(zTail-zSq
1d470 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
1d480 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  ( (int)strlen(zT
1d490 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20  ail)<bytes ){.  
1d4a0 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74      bytes = (int
1d4b0 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a  )strlen(zTail);.
1d4c0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62      }.    Tcl_Ob
1d4d0 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1d4e0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c   objv[4], 0, Tcl
1d4f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
1d500 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b  ail, bytes), 0);
1d510 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1d520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d530 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
1d540 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1d550 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1d560 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25  zBuf), zBuf, "(%
1d570 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
1d580 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d590 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
1d5a0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1d5b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d5c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d5d0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1d5e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1d5f0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1d600 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1d610 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d620 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
1d630 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d640 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1d650 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1d660 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d670 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
1d680 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
1d690 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1d6a0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1d6b0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1d6c0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1d6d0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1d6e0 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1d6f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1d700 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1d710 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1d720 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1d730 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1d740 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1d750 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1d760 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1d770 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1d780 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1d790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d7a0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1d7b0 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20  st_prepare_v2(. 
1d7c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d7d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1d7e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1d7f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1d800 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1d810 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1d820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1d830 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  ql;.  char *zCop
1d840 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
1d850 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28        /* malloc(
1d860 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20 2a  ) copy of zSql *
1d870 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  /.  int bytes;. 
1d880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1d890 69 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  il = 0;.  const 
1d8a0 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 3b 0a 20  char **pzTail;. 
1d8b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d8c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1d8d0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
1d8e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1d8f0 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1d900 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1d920 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1d930 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1d940 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1d950 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1d960 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1d970 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
1d980 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d990 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1d9a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1d9b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d9c0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1d9d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d9e0 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
1d9f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
1da00 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1da10 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1da20 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
1da30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1da40 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74  RROR;..  /* Inst
1da50 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53 71  ead of using zSq
1da60 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b 65  l directly, make
1da70 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20 62   a copy into a b
1da80 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a 20  uffer obtained. 
1da90 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72 6f   ** directly fro
1daa0 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 20  m malloc(). The 
1dab0 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65 20  idea is to make 
1dac0 69 74 20 65 61 73 69 65 72 20 66 6f 72 20 76 61  it easier for va
1dad0 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20 73  lgrind.  ** to s
1dae0 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  pot buffer overr
1daf0 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eads.  */.  if( 
1db00 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
1db10 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 62  zCopy = malloc(b
1db20 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ytes);.    memcp
1db30 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 62  y(zCopy, zSql, b
1db40 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
1db50 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
1db60 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b 20  )strlen(zSql) + 
1db70 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d  1;.    zCopy = m
1db80 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d 65  alloc(n);.    me
1db90 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
1dba0 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70 7a 54 61  , n);.  }.  pzTa
1dbb0 69 6c 20 3d 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  il = objc>=5 ? &
1dbc0 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20 72 63 20  zTail : 0;.  rc 
1dbd0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1dbe0 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c 20  e_v2(db, zCopy, 
1dbf0 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 70  bytes, &pStmt, p
1dc00 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 6f 62  zTail);.  if( ob
1dc10 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 7a 54 61  jc>=5 ){.    zTa
1dc20 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54 61 69  il = &zSql[(zTai
1dc30 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 20 20 7d  l - zCopy)];.  }
1dc40 0a 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a  .  free(zCopy);.
1dc50 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1dc60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1dc70 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  ==0);.  Tcl_Rese
1dc80 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1dc90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1dca0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1dcb0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1dcc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dcd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dce0 4b 20 26 26 20 6f 62 6a 63 3e 3d 35 20 26 26 20  K && objc>=5 && 
1dcf0 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28  zTail ){.    if(
1dd00 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1dd10 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1dd20 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1dd30 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1dd40 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1dd50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1dd60 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
1dd70 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
1dd80 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
1dd90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dda0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1ddb0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1ddc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1ddd0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1dde0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1ddf0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1de00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1de10 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1de20 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1de30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1de40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1de50 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1de60 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1de70 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1de80 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1de90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1dea0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1deb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1dec0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1ded0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1dee0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1def0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 20  ite3_prepare_v3 
1df00 44 42 20 73 71 6c 20 62 79 74 65 73 20 66 6c 61  DB sql bytes fla
1df10 67 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  gs ?tailvar?.**.
1df20 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
1df30 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
1df40 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
1df50 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
1df60 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
1df70 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 20 61 6e  e handle <DB> an
1df80 64 20 66 6c 61 67 73 20 3c 66 6c 61 67 73 3e 2e  d flags <flags>.
1df90 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1dfa0 74 61 69 6c 76 61 6c 3e 20 69 73 0a 2a 2a 20 74  tailval> is.** t
1dfb0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
1dfc0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 68 61  bal variable tha
1dfd0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1dfe0 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1dff0 66 0a 2a 2a 20 3c 73 71 6c 3e 20 28 69 66 20 61  f.** <sql> (if a
1e000 6e 79 29 2e 20 41 20 53 54 4d 54 20 68 61 6e 64  ny). A STMT hand
1e010 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1e020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1e030 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1e040 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20 20 76  _prepare_v3(.  v
1e050 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e060 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e070 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1e080 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1e090 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1e0a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e0b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1e0c0 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20  ;.  char *zCopy 
1e0d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e0e0 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20      /* malloc() 
1e0f0 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a  copy of zSql */.
1e100 20 20 69 6e 74 20 62 79 74 65 73 2c 20 66 6c 61    int bytes, fla
1e110 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
1e120 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 63   *zTail = 0;.  c
1e130 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
1e140 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  il;.  sqlite3_st
1e150 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1e160 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1e170 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1e180 20 6f 62 6a 63 21 3d 36 20 26 26 20 6f 62 6a 63   objc!=6 && objc
1e190 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
1e1a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e1b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e1c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e1d0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e1e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e1f0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1e200 20 66 6c 61 67 73 20 74 61 69 6c 76 61 72 22 2c   flags tailvar",
1e210 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e230 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e240 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1e250 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1e260 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1e270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1e280 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
1e290 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
1e2a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1e2b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1e2c0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1e2d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e2e0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1e2f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1e300 20 6f 62 6a 76 5b 34 5d 2c 20 26 66 6c 61 67 73   objv[4], &flags
1e310 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e320 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74  RROR;..  /* Inst
1e330 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53 71  ead of using zSq
1e340 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b 65  l directly, make
1e350 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20 62   a copy into a b
1e360 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a 20  uffer obtained. 
1e370 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72 6f   ** directly fro
1e380 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 20  m malloc(). The 
1e390 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65 20  idea is to make 
1e3a0 69 74 20 65 61 73 69 65 72 20 66 6f 72 20 76 61  it easier for va
1e3b0 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20 73  lgrind.  ** to s
1e3c0 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  pot buffer overr
1e3d0 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eads.  */.  if( 
1e3e0 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
1e3f0 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 62  zCopy = malloc(b
1e400 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ytes);.    memcp
1e410 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 62  y(zCopy, zSql, b
1e420 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
1e430 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
1e440 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b 20  )strlen(zSql) + 
1e450 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d  1;.    zCopy = m
1e460 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d 65  alloc(n);.    me
1e470 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
1e480 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70 7a 54 61  , n);.  }.  pzTa
1e490 69 6c 20 3d 20 6f 62 6a 63 3e 3d 36 20 3f 20 26  il = objc>=6 ? &
1e4a0 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20 72 63 20  zTail : 0;.  rc 
1e4b0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1e4c0 65 5f 76 33 28 64 62 2c 20 7a 43 6f 70 79 2c 20  e_v3(db, zCopy, 
1e4d0 62 79 74 65 73 2c 20 28 75 6e 73 69 67 6e 65 64  bytes, (unsigned
1e4e0 20 69 6e 74 29 66 6c 61 67 73 2c 26 70 53 74 6d   int)flags,&pStm
1e4f0 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 66 72 65  t,pzTail);.  fre
1e500 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7a 54 61 69  e(zCopy);.  zTai
1e510 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54 61 69 6c  l = &zSql[(zTail
1e520 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a 20 20 61   - zCopy)];..  a
1e530 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
1e540 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
1e550 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
1e560 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
1e570 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1e580 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1e590 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1e5a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1e5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e5c0 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d   zTail && objc>=
1e5d0 36 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74  6 ){.    if( byt
1e5e0 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  es>=0 ){.      b
1e5f0 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28  ytes = bytes - (
1e600 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  int)(zTail-zSql)
1e610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
1e620 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1e630 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 30 2c 20 54  p, objv[5], 0, T
1e640 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1e650 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
1e660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1e670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e680 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1e690 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1e6a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1e6b0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1e6c0 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1e6d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e6e0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1e6f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1e700 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1e710 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e720 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1e730 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e740 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1e750 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1e760 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1e770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1e780 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e790 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1e7a0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1e7b0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1e7c0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1e7d0 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
1e7e0 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61   DB.**.** Genera
1e7f0 74 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74  te a prepared st
1e800 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65  atement for a ze
1e810 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61  ro-byte string a
1e820 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20  s a test.** for 
1e830 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54  ticket #3134.  T
1e840 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  he string should
1e850 20 62 65 20 70 72 65 63 65 64 65 64 20 62 79 20   be preceded by 
1e860 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a  a zero byte..*/.
1e870 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1e880 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72  E_TCLAPI test_pr
1e890 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20  epare_tkt3134(. 
1e8a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e8b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e8c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e8d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e8e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e8f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e900 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e910 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30  har zSql[] = "\0
1e920 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73  00SELECT 1";.  s
1e930 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1e940 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
1e950 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
1e960 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1e970 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1e980 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e990 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1e9a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1e9b0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1e9c0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1e9d0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
1e9e0 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
1e9f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ea00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1ea10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1ea20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1ea30 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1ea40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ea50 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1ea60 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
1ea70 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70   &zSql[1], 0, &p
1ea80 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  Stmt, 0);.  asse
1ea90 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
1eaa0 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20   || pStmt==0);. 
1eab0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1eac0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1ead0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1eae0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1eaf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eb00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1eb10 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
1eb20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1eb30 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1eb40 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1eb50 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1eb60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1eb70 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1eb80 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1eb90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1eba0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1ebb0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1ebc0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1ebd0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1ebe0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1ebf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ec00 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1ec10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1ec20 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1ec30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ec40 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ec50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20  lite3_prepare16 
1ec60 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
1ec70 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
1ec80 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1ec90 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1eca0 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1ecb0 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1ecc0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1ecd0 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1ece0 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1ecf0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1ed00 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1ed10 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1ed20 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1ed30 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1ed40 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1ed50 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1ed60 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ed70 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1ed80 49 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  I test_prepare16
1ed90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1eda0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1edb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1edc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1edd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ede0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1edf0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1ee00 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1ee10 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1ee20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1ee30 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1ee40 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1ee50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ee60 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1ee70 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1ee80 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1ee90 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1eea0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1eeb0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1eec0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1eed0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1eee0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1eef0 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1ef00 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1ef10 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1ef20 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1ef30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ef40 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ef50 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ef60 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1ef70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1ef80 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1ef90 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1efa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1efb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1efc0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1efd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1efe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1eff0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f000 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1f010 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1f020 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1f030 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1f040 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1f050 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1f060 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1f070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1f080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1f090 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71  repare16(db, zSq
1f0a0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1f0b0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1f0c0 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1f0d0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1f0e0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1f0f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f100 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1f110 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1f120 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1f130 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1f140 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1f150 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1f160 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1f170 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1f180 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1f190 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1f1a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1f1b0 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1f1c0 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1f1d0 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1f1e0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1f1f0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1f200 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1f210 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1f220 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1f230 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1f240 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1f250 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1f260 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1f270 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1f280 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1f290 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1f2a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f2b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f2c0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1f2d0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1f2e0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1f2f0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1f300 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f310 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1f320 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62  re16_v2 DB sql b
1f330 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1f340 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1f350 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1f360 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1f370 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1f380 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1f390 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1f3a0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1f3b0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1f3c0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1f3d0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1f3e0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1f3f0 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1f400 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1f410 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1f420 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1f430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1f440 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1f450 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20  _prepare16_v2(. 
1f460 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f470 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f480 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f490 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f4a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f4b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f4c0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
1f4d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1f4e0 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
1f4f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
1f500 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
1f510 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
1f520 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1f530 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
1f540 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
1f550 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
1f580 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
1f590 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
1f5a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1f5b0 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
1f5c0 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
1f5d0 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
1f5e0 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
1f5f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f600 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f610 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1f620 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1f630 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1f640 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1f650 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1f660 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
1f670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f680 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f690 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f6a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f6b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1f6c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6d0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1f6e0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1f6f0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
1f700 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
1f710 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1f720 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1f730 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1f740 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1f750 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1f760 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71  are16_v2(db, zSq
1f770 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1f780 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1f790 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1f7a0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1f7b0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1f7c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f7d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1f7e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1f7f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1f800 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1f810 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1f820 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1f830 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1f840 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1f850 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1f860 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1f870 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1f880 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1f890 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1f8a0 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1f8b0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1f8c0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1f8d0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1f8e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1f8f0 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1f900 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1f910 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1f920 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1f930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1f940 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1f950 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1f960 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1f970 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f980 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f990 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1f9a0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1f9b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1f9c0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1f9d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f9e0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
1f9f0 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
1fa00 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
1fa10 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1fa20 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20  API test_open(. 
1fa30 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1fa40 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1fa50 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1fa60 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1fa70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1fa80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1fa90 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
1faa0 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
1fab0 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
1fac0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
1fad0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
1fae0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1faf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1fb00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1fb10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1fb20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1fb30 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1fb40 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1fb50 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  -list", 0);.    
1fb60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fb70 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61  ;.  }..  zFilena
1fb80 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63  me = objc>1 ? Tc
1fb90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fba0 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c 69  [1]) : 0;.  sqli
1fbb0 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  te3_open(zFilena
1fbc0 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
1fbd0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1fbe0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1fbf0 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
1fc00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fc10 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
1fc20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1fc30 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
1fc40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1fc50 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1fc60 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41 4d  _open_v2 FILENAM
1fc70 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a 73  E FLAGS VFS.*/.s
1fc80 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1fc90 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65  _TCLAPI test_ope
1fca0 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63  n_v2(.  void * c
1fcb0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1fcc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fcd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1fce0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fcf0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
1fd00 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1fd10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1fd20 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
1fd30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
1fd40 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
1fd50 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1fd60 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20  ..  int nFlag;. 
1fd70 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61   Tcl_Obj **apFla
1fd80 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  g;.  int i;..  i
1fd90 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
1fda0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1fdb0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1fdc0 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c  jv, "FILENAME FL
1fdd0 41 47 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72  AGS VFS");.    r
1fde0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fdf0 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
1fe00 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1fe10 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66  (objv[1]);.  zVf
1fe20 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
1fe30 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66  g(objv[3]);.  if
1fe40 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20  ( zVfs[0]==0x00 
1fe50 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72  ) zVfs = 0;..  r
1fe60 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  c = Tcl_ListObjG
1fe70 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
1fe80 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c  p, objv[2], &nFl
1fe90 61 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20  ag, &apFlag);.  
1fea0 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
1feb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f   return rc;.  fo
1fec0 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20  r(i=0; i<nFlag; 
1fed0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  i++){.    int iF
1fee0 6c 61 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20  lag;.    struct 
1fef0 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20  OpenFlag {.     
1ff00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c   const char *zFl
1ff10 61 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c  ag;.      int fl
1ff20 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b  ag;.    } aFlag[
1ff30 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53  ] = {.      { "S
1ff40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1ff50 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NLY", SQLITE_OPE
1ff60 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
1ff70 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1ff80 45 4e 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53  EN_READWRITE", S
1ff90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1ffa0 52 49 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RITE },.      { 
1ffb0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  "SQLITE_OPEN_CRE
1ffc0 41 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE", SQLITE_OPE
1ffd0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
1ffe0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1fff0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c  _DELETEONCLOSE",
20000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
20010 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20  ETEONCLOSE },.  
20020 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20030 45 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53  EN_EXCLUSIVE", S
20040 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
20050 53 49 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  SIVE },.      { 
20060 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54  "SQLITE_OPEN_AUT
20070 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f  OPROXY", SQLITE_
20080 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d  OPEN_AUTOPROXY }
20090 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
200a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c  E_OPEN_MAIN_DB",
200b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
200c0 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20  N_DB },.      { 
200d0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  "SQLITE_OPEN_TEM
200e0 50 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  P_DB", SQLITE_OP
200f0 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20  EN_TEMP_DB },.  
20100 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20110 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22  EN_TRANSIENT_DB"
20120 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  , SQLITE_OPEN_TR
20130 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20  ANSIENT_DB },.  
20140 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20150 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22  EN_MAIN_JOURNAL"
20160 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
20170 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  IN_JOURNAL },.  
20180 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20190 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22  EN_TEMP_JOURNAL"
201a0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  , SQLITE_OPEN_TE
201b0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  MP_JOURNAL },.  
201c0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
201d0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20  EN_SUBJOURNAL", 
201e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
201f0 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
20200 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
20210 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20  ASTER_JOURNAL", 
20220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
20230 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  ER_JOURNAL },.  
20240 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20250 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c  EN_NOMUTEX", SQL
20260 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
20270 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
20280 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
20290 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  EX", SQLITE_OPEN
202a0 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20  _FULLMUTEX },.  
202b0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
202c0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c  EN_SHAREDCACHE",
202d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
202e0 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
202f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
20300 5f 50 52 49 56 41 54 45 43 41 43 48 45 22 2c 20  _PRIVATECACHE", 
20310 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
20320 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
20330 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
20340 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  _WAL", SQLITE_OP
20350 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20  EN_WAL },.      
20360 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  { "SQLITE_OPEN_U
20370 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  RI", SQLITE_OPEN
20380 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _URI },.      { 
20390 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
203a0 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
203b0 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
203c0 28 69 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b  (interp, apFlag[
203d0 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f  i], aFlag, sizeo
203e0 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20  f(aFlag[0]), .  
203f0 20 20 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c        "flag", 0,
20400 20 26 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20   &iFlag.    );. 
20410 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f     if( rc!=TCL_O
20420 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
20430 20 20 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61     flags |= aFla
20440 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20  g[iFlag].flag;. 
20450 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
20460 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
20470 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73  name, &db, flags
20480 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73  , zVfs);.  if( s
20490 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
204a0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
204b0 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
204c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
204d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
204e0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
204f0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
20500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20510 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
20520 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  n16 filename opt
20530 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ions.*/.static i
20540 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
20550 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
20560 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20570 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20580 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20590 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
205a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
205b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
205c0 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
205d0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
205e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
205f0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
20600 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
20610 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
20620 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
20630 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
20640 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
20650 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
20660 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
20670 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
20680 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
20690 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
206a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
206b0 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42  ename = Tcl_GetB
206c0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
206d0 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73  objv[1], 0);.  s
206e0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46  qlite3_open16(zF
206f0 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
20700 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
20710 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
20720 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
20730 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20740 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
20750 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
20760 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
20770 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
20780 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
20790 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
207a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
207b0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20  ite3_complete16 
207c0 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a  <UTF-16 string>.
207d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
207e0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61  f the supplied a
207f0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d  rgument is a com
20800 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
20810 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  ent, or zero.** 
20820 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
20830 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
20840 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6d 70  TCLAPI test_comp
20850 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  lete16(.  void *
20860 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
20870 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20880 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
20890 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
208a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64  objv[].){.#if !d
208b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
208c0 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20  IT_COMPLETE) && 
208d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
208e0 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68  OMIT_UTF16).  ch
208f0 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28  ar *zBuf;..  if(
20900 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20910 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20920 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20930 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22  , "<utf-16 sql>"
20940 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20950 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
20960 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63  zBuf = (char*)Tc
20970 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
20980 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
20990 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
209a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
209b0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
209c0 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
209d0 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f  Buf)));.#endif /
209e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
209f0 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45  MPLETE && SQLITE
20a00 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
20a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20a20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20a30 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a  sqlite3_normaliz
20a40 65 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 52 65 74 75  e SQL.**.** Retu
20a50 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65  rn the normalize
20a60 64 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 53  d value for an S
20a70 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
20a80 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
20a90 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6e  TE_TCLAPI test_n
20aa0 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64  ormalize(.  void
20ab0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20ac0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20ad0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
20ae0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20af0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
20b00 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20b10 20 2a 7a 4e 6f 72 6d 3b 0a 20 20 65 78 74 65 72   *zNorm;.  exter
20b20 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  n char *sqlite3_
20b30 6e 6f 72 6d 61 6c 69 7a 65 28 63 6f 6e 73 74 20  normalize(const 
20b40 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 6f  char*);..  if( o
20b50 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
20b60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
20b70 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
20b80 22 53 51 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  "SQL");.    retu
20b90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20ba0 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 28 63 68 61  }..  zSql = (cha
20bb0 72 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  r*)Tcl_GetString
20bc0 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 4e 6f  (objv[1]);.  zNo
20bd0 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6e 6f 72  rm = sqlite3_nor
20be0 6d 61 6c 69 7a 65 28 7a 53 71 6c 29 3b 0a 20 20  malize(zSql);.  
20bf0 69 66 28 20 7a 4e 6f 72 6d 20 29 7b 0a 20 20 20  if( zNorm ){.   
20c00 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20c10 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20c20 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 6f 72 6d  wStringObj(zNorm
20c30 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
20c40 74 65 33 5f 66 72 65 65 28 7a 4e 6f 72 6d 29 3b  te3_free(zNorm);
20c50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
20c60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
20c70 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
20c80 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
20c90 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
20ca0 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
20cb0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
20cc0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
20cd0 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f   test_step(.  vo
20ce0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20cf0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20d00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
20d10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
20d20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
20d30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
20d40 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
20d50 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
20d60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20d70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
20d80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20d90 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
20da0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
20db0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
20dc0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
20dd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20de0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
20df0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
20e00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
20e10 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
20e20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20e30 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
20e40 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
20e50 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53  ..  /* if( rc!=S
20e60 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63  QLITE_DONE && rc
20e70 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72  !=SQLITE_ROW ) r
20e80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20e90 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73   */.  Tcl_SetRes
20ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
20eb0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
20ec0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
20ed0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
20ee0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20ef0 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 28 0a  CLAPI test_sql(.
20f00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20f10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20f20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20f30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20f40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20f50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
20f60 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
20f70 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
20f80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
20f90 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
20fa0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
20fb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20fc0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
20fd0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20fe0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20ff0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
21000 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
21010 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
21020 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
21030 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71  har *)sqlite3_sq
21040 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f  l(pStmt), TCL_VO
21050 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
21060 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  n TCL_OK;.}.stat
21070 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
21080 4c 41 50 49 20 74 65 73 74 5f 65 78 5f 73 71 6c  LAPI test_ex_sql
21090 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
210a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
210b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
210c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
210d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
210e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
210f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
21100 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  r *z;..  if( obj
21110 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
21120 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21130 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
21140 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
21150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21160 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
21170 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21180 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21190 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
211a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
211b0 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  R;.  z = sqlite3
211c0 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53  _expanded_sql(pS
211d0 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  tmt);.  Tcl_SetR
211e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
211f0 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
21200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21210 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
21220 4f 4b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  OK;.}.#ifdef SQL
21230 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
21240 4c 49 5a 45 0a 73 74 61 74 69 63 20 69 6e 74 20  LIZE.static int 
21250 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
21260 73 74 5f 6e 6f 72 6d 5f 73 71 6c 28 0a 20 20 76  st_norm_sql(.  v
21270 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21280 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21290 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
212a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
212b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
212c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
212d0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
212e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
212f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21300 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
21310 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
21320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21330 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
21340 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21350 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21360 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
21370 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21380 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
21390 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
213a0 20 2a 29 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61   *)sqlite3_norma
213b0 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29  lized_sql(pStmt)
213c0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
213d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
213e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
213f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
21400 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALIZE */../*.** 
21410 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
21420 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
21430 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
21440 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
21450 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
21460 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
21470 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
21480 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
21490 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e  LAPI test_column
214a0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
214b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
214c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
214d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
214e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
214f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
21500 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
21510 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
21520 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
21530 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
21540 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
21550 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
21560 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
21570 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
21580 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
21590 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
215a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
215b0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
215c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
215d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
215e0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
215f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
21600 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
21610 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
21620 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
21630 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
21640 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
21650 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21660 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
21670 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54  column_type STMT
21680 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
21690 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66  turn the type of
216a0 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
216b0 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
216c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
216d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
216e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
216f0 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20  t_column_type(. 
21700 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21710 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21720 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21730 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21740 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21750 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21760 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
21770 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20  l;.  int tp;..  
21780 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
21790 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
217a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
217b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
217c0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
217d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
217e0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
217f0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
21800 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21810 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
21820 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
21830 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
21840 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
21850 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
21860 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21870 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21880 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
21890 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
218a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
218b0 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tp = sqlite3_col
218c0 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
218d0 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  col);.  switch( 
218e0 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  tp ){.    case S
218f0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a  QLITE_INTEGER: .
21900 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
21910 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54  ult(interp, "INT
21920 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49  EGER", TCL_STATI
21930 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
21940 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
21950 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63  E_NULL:.      Tc
21960 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
21970 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f  rp, "NULL", TCL_
21980 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
21990 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
219a0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
219b0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
219c0 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54  t(interp, "FLOAT
219d0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
219e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
219f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
21a00 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  XT:.      Tcl_Se
21a10 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
21a20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54  "TEXT", TCL_STAT
21a30 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
21a40 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
21a50 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54  TE_BLOB:.      T
21a60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
21a70 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c  erp, "BLOB", TCL
21a80 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
21a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
21aa0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
21ab0 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  t(0);.  }..  ret
21ac0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
21ad0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
21ae0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
21af0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
21b00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
21b10 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
21b20 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
21b30 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
21b40 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d   an.** wide (64-
21b50 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  bit) integer..*/
21b60 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
21b70 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
21b80 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76  olumn_int64(.  v
21b90 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21ba0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21bb0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
21bc0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
21bd0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
21be0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
21bf0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
21c00 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20  .  i64 iVal;..  
21c10 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
21c20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
21c30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
21c40 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
21c50 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
21c60 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
21c70 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
21c80 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
21c90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21ca0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
21cb0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
21cc0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
21cd0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
21ce0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
21cf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21d00 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21d10 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
21d20 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
21d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
21d40 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  iVal = sqlite3_c
21d50 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
21d60 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
21d70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21d80 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
21d90 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20  ntObj(iVal));.  
21da0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
21db0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
21dc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
21dd0 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  ob STMT column.*
21de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
21df0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
21e00 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
21e10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
21e20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
21e30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
21e40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
21e50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
21e60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
21e70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
21e80 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
21e90 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
21ea0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
21eb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
21ec0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
21ed0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
21ee0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
21ef0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21f00 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
21f10 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
21f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
21f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
21f40 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
21f50 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21f60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21f70 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
21f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21f90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
21fa0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
21fb0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
21fc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21fd0 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
21fe0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
21ff0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
22000 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
22010 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
22020 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
22030 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22040 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
22050 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
22060 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
22070 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
22080 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
22090 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
220a0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
220b0 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
220c0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
220d0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
220e0 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
220f0 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
22100 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
22110 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f  I test_column_do
22120 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
22130 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
22140 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22150 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
22160 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22170 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
22180 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
22190 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62   int col;.  doub
221a0 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20  le rVal;..  if( 
221b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
221c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
221d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
221e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
221f0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
22200 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22210 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
22220 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
22230 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22240 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
22250 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
22260 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22270 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
22280 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22290 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
222a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
222b0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
222c0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
222d0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c  L_ERROR;..  rVal
222e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
222f0 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
22300 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
22310 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
22320 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
22330 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75  j(rVal));.  retu
22340 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22350 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22360 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54  e3_data_count ST
22370 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
22380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
22390 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
223a0 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
223b0 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
223c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
223d0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61 74 61  TCLAPI test_data
223e0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
223f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
22400 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22410 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
22420 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22430 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
22440 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
22450 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
22460 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22480 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
22490 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
224a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
224b0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
224c0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
224d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
224e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
224f0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
22500 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
22510 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
22520 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
22530 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
22540 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
22550 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
22560 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
22570 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
22580 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
22590 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
225a0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
225b0 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
225c0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
225d0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
225e0 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
225f0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
22600 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
22610 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
22620 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
22630 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
22640 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
22650 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
22660 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
22670 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
22680 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
22690 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
226a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
226b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
226c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
226d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
226e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
226f0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
22700 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
22710 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
22720 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
22730 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
22740 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
22750 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
22760 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
22770 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
22780 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
22790 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
227a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
227b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
227c0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
227d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
227e0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
227f0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
22800 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22810 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
22820 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
22830 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
22840 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
22850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
22860 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
22870 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
22880 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
22890 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
228a0 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
228b0 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
228c0 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
228d0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
228e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
228f0 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
22900 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
22910 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
22920 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
22930 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
22940 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
22950 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
22960 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
22970 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
22980 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22990 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
229a0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
229b0 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ATED.  int rc;. 
229c0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
229d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
229e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
229f0 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
22a00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22a10 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
22a20 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
22a30 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  er();.  Tcl_SetR
22a40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
22a50 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
22a60 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22a70 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  C);.#endif.  ret
22a80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22a90 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
22aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
22ab0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
22ac0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
22ad0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
22ae0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
22af0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
22b00 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
22b10 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
22b20 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
22b30 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
22b40 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  utf16(.  void * 
22b50 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
22b60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
22b70 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
22b80 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
22b90 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
22ba0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
22bb0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
22bc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
22bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22be0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
22bf0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
22c00 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63  .  int col;.  Tc
22c10 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63  l_Obj *pRet;.  c
22c20 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
22c30 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16;.  const void
22c40 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
22c50 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
22c60 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73  .  xFunc = (cons
22c70 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69  t void *(*)(sqli
22c80 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
22c90 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
22ca0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
22cb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22cc0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
22cd0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
22ce0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
22cf0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22d00 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
22d10 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
22d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22d30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
22d40 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
22d50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22d60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
22d70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
22d80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
22d90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
22da0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
22db0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
22dc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e  TCL_ERROR;..  zN
22dd0 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53  ame16 = xFunc(pS
22de0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
22df0 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20   zName16 ){.    
22e00 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  int n;.    const
22e10 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65   char *z = zName
22e20 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  16;.    for(n=0;
22e30 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b   z[n] || z[n+1];
22e40 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65   n+=2){}.    pRe
22e50 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  t = Tcl_NewByteA
22e60 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c  rrayObj(zName16,
22e70 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53   n+2);.    Tcl_S
22e80 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
22e90 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23  rp, pRet);.  }.#
22ea0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22eb0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20  OMIT_UTF16 */.. 
22ec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
22ee0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
22ef0 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  nt STMT column.*
22f00 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
22f10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
22f20 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
22f30 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
22f40 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
22f50 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
22f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
22f70 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
22f80 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69  _stmt_int(.  voi
22f90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
22fa0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22fb0 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
22fc0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
22fd0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
22fe0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
22ff0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
23000 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
23010 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
23020 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
23030 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75  col;.  int (*xFu
23040 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
23050 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
23060 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c  c = (int (*)(sql
23070 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
23080 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
23090 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
230a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
230b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
230c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
230d0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
230e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
230f0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
23100 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
23110 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23120 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
23130 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
23140 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23150 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
23160 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
23170 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
23180 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
23190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
231a0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
231b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
231c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
231d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
231e0 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d  ntObj(xFunc(pStm
231f0 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74  t, col)));.  ret
23200 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
23210 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
23220 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44  ite_set_magic  D
23230 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a  B  MAGIC-NUMBER.
23240 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62  **.** Set the db
23250 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20  ->magic value.  
23260 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
23270 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76  test error recov
23280 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ery logic..*/.st
23290 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
232a0 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f 73 65  TCLAPI sqlite_se
232b0 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20  t_magic(.  void 
232c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
232d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
232e0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
232f0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
23300 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23310 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
23320 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
23330 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
23340 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
23350 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
23360 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20  [0],.         " 
23370 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20  DB MAGIC", 0);. 
23380 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23390 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
233a0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
233b0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
233c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
233d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
233e0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
233f0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29  ITE_MAGIC_OPEN")
23400 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
23410 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
23420 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GIC_OPEN;.  }els
23430 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
23440 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
23450 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20  GIC_CLOSED")==0 
23460 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
23470 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
23480 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  CLOSED;.  }else 
23490 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
234a0 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
234b0 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20  C_BUSY")==0 ){. 
234c0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
234d0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
234e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
234f0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
23500 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
23510 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  R")==0 ){.    db
23520 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
23530 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
23540 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65  }else if( Tcl_Ge
23550 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
23560 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d  v[2], (int*)&db-
23570 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72  >magic) ){.    r
23580 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
235a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
235b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69  sage:  sqlite3_i
235c0 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a  nterrupt  DB .**
235d0 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69  .** Trigger an i
235e0 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a  nterrupt on DB.*
235f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
23600 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
23610 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
23620 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
23630 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23640 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
23650 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
23660 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23670 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
23680 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23690 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
236a0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
236b0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
236c0 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
236d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
236e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
236f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
23700 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
23710 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
23720 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
23730 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
23740 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
23750 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
23760 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  e: sqlite_delete
23770 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e  _function DB fun
23780 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ction-name.**.**
23790 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65 72   Delete the user
237a0 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74   function 'funct
237b0 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64  ion-name' from d
237c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44  atabase handle D
237d0 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75  B. It.** is assu
237e0 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73 65  med that the use
237f0 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  r function was c
23800 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c 20  reated as UTF8, 
23810 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  any number of.**
23820 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20   arguments (the 
23830 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
23840 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
23850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
23860 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65 6c 65  LITE_TCLAPI dele
23870 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
23880 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
23890 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
238a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
238b0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
238c0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
238d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
238e0 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
238f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
23900 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
23910 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
23920 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
23930 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
23940 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
23950 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23970 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
23980 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
23990 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
239a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
239b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
239c0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
239d0 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
239e0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
239f0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
23a00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
23a10 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
23a20 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
23a30 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
23a40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23a50 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
23a60 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
23a70 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
23a80 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
23a90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
23aa0 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
23ab0 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
23ac0 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
23ad0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
23ae0 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
23af0 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
23b00 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
23b10 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
23b20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
23b30 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
23b40 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
23b50 41 50 49 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  API delete_colla
23b60 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
23b70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
23b80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23b90 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
23ba0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
23bb0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
23bc0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
23bd0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
23be0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23bf0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23c00 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23c10 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
23c20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
23c30 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
23c40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23c50 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
23c60 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
23c70 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
23c80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
23c90 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
23ca0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
23cb0 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
23cc0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
23cd0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
23ce0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
23cf0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
23d00 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
23d10 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
23d20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23d30 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74  age: sqlite3_get
23d40 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a  _autocommit DB.*
23d50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
23d60 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
23d70 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79   DB is currently
23d80 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20   in auto-commit 
23d90 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  mode..** Return 
23da0 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
23db0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
23dc0 54 45 5f 54 43 4c 41 50 49 20 67 65 74 5f 61 75  TE_TCLAPI get_au
23dd0 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64  tocommit(.  void
23de0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
23df0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23e00 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
23e10 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
23e20 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  {.  char zBuf[30
23e30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
23e40 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
23e50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23e60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23e70 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23e80 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
23e90 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
23ea0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
23eb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23ec0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
23ed0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
23ee0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
23ef0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23f00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
23f10 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
23f20 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 73  ), zBuf, "%d", s
23f30 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
23f40 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63  ommit(db));.  Tc
23f50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23f60 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
23f70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
23f90 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  : sqlite3_busy_t
23fa0 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a  imeout DB MS.**.
23fb0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
23fc0 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69  timeout.  This i
23fd0 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f  s more easily do
23fe0 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d  ne using the tim
23ff0 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  eout.** method o
24000 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  f the TCL interf
24010 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ace.  But we nee
24020 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74 20  d a way to test 
24030 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  the case.** wher
24040 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  e it returns SQL
24050 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73  ITE_MISUSE..*/.s
24060 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
24070 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 75 73  _TCLAPI test_bus
24080 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69  y_timeout(.  voi
24090 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
240a0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
240b0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
240c0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
240d0 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b  ){.  int rc, ms;
240e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
240f0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
24100 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24110 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
24120 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
24130 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
24140 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
24150 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
24160 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24170 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
24180 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
24190 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
241a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
241b0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
241c0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
241d0 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
241e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
241f0 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  = sqlite3_busy_t
24200 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a  imeout(db, ms);.
24210 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24220 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
24230 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
24240 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24250 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
24260 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c  ge:  tcl_variabl
24270 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e  e_type VARIABLEN
24280 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
24290 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
242a0 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
242b0 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
242c0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
242d0 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e   given variable.
242e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
242f0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63 6c  QLITE_TCLAPI tcl
24300 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a  _variable_type(.
24310 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
24320 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
24330 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
24340 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
24350 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
24360 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
24370 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  r;.  if( objc!=2
24380 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
24390 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
243a0 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41   1, objv, "VARIA
243b0 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  BLE");.    retur
243c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
243d0 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  .  pVar = Tcl_Ge
243e0 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
243f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24400 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c  jv[1]), 0, TCL_L
24410 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20  EAVE_ERR_MSG);. 
24420 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72   if( pVar==0 ) r
24430 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24440 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70  .  if( pVar->typ
24450 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ePtr ){.    Tcl_
24460 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
24470 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
24480 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65  ngObj(pVar->type
24490 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b  Ptr->name, -1));
244a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
244b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
244c0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
244d0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e  elease_memory ?N
244e0 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ?.**.** Attempt 
244f0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
24500 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
24510 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
24520 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54  y required..** T
24530 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20  he integer N is 
24540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
24550 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e  tes we are tryin
24560 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54  g to release.  T
24570 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  he .** return va
24580 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  lue is the amoun
24590 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75  t of memory actu
245a0 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  ally released..*
245b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
245c0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
245d0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
245e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
245f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
24600 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
24610 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
24620 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
24630 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
24640 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
24650 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26  RY_MANAGEMENT) &
24660 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
24670 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
24680 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61 6d   int N;.  int am
24690 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  t;.  if( objc!=1
246a0 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
246b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
246c0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
246d0 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20  bjv, "?N?");.   
246e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
246f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
24700 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
24710 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
24720 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
24730 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20  ], &N) ) return 
24740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
24750 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b 0a  se{.    N = -1;.
24760 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69    }.  amt = sqli
24770 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
24780 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ry(N);.  Tcl_Set
24790 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
247a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
247b0 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  amt));.#endif.  
247c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
247d0 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
247e0 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
247f0 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a  ase_memory DB.**
24800 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  .** Attempt to r
24810 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75  elease memory cu
24820 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79 20  rrently held by 
24830 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 52 65  database DB.  Re
24840 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  turn the.** resu
24850 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68 20 69  lt code (which i
24860 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
24870 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
24880 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f  always zero)..*/
24890 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
248a0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
248b0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
248c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
248d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
248e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
248f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
24900 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
24910 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24920 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
24930 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
24940 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24950 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24960 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
24970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24980 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24990 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
249a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
249b0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
249c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
249d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
249e0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
249f0 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  y(db);.  Tcl_Set
24a00 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24a10 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24a20 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
24a30 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24a40 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
24a50 64 62 5f 63 61 63 68 65 66 6c 75 73 68 20 44 42  db_cacheflush DB
24a60 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
24a70 6f 20 66 6c 75 73 68 20 61 6e 79 20 64 69 72 74  o flush any dirt
24a80 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
24a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24aa0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24ab0 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28  t_db_cacheflush(
24ac0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
24ad0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
24ae0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
24af0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
24b00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
24b10 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24b20 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
24b30 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
24b40 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
24b50 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
24b60 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
24b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24b80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24b90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24ba0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24bb0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
24bc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
24be0 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64 62 29  b_cacheflush(db)
24bf0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
24c00 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
24c10 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
24c20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
24c30 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
24c40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24c50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c  RROR;.  }..  Tcl
24c60 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
24c70 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
24c80 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24c90 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
24ca0 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44 42 0a  system_errno DB.
24cb0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
24cc0 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73 74 65   low-level syste
24cd0 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e 0a 2a  m errno value..*
24ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
24cf0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
24d00 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a 20 20  system_errno(.  
24d10 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
24d20 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
24d30 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
24d40 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
24d50 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
24d60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24d70 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20 20 69   int iErrno;.  i
24d80 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
24d90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24da0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24db0 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
24dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24dd0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24de0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
24df0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24e00 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
24e10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24e20 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71 6c 69  .  iErrno = sqli
24e30 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  te3_system_errno
24e40 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
24e50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
24e60 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69   Tcl_NewIntObj(i
24e70 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74 75 72  Errno));.  retur
24e80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
24e90 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
24ea0 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20 44  e3_db_filename D
24eb0 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  B DBNAME.**.** R
24ec0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
24ed0 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69 61  f a file associa
24ee0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
24ef0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
24f00 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
24f10 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d   test_db_filenam
24f20 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
24f30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
24f40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
24f50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
24f60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24f70 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
24f80 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
24f90 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28   *zDbName;.  if(
24fa0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
24fb0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
24fc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
24fd0 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
24fe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24ff0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25000 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
25010 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
25020 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
25030 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
25040 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20  RROR;.  zDbName 
25050 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
25060 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  objv[2]);.  Tcl_
25070 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25080 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f  erp, sqlite3_db_
25090 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62  filename(db, zDb
250a0 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29 30 29  Name), (void*)0)
250b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
250c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
250d0 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  e:  sqlite3_db_r
250e0 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d  eadonly DB DBNAM
250f0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  E.**.** Return 1
25100 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d 45 20   or 0 if DBNAME 
25110 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e  is readonly or n
25120 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ot.  Return -1 i
25130 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a  f DBNAME does.**
25140 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73   not exist..*/.s
25150 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
25160 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62 5f  _TCLAPI test_db_
25170 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  readonly(.  void
25180 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
25190 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
251a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
251b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
251c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
251d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
251e0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
251f0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
25200 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
25210 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
25220 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
25230 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
25240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25250 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
25260 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
25270 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
25280 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
25290 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
252a0 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
252b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
252c0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
252d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
252e0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
252f0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62  3_db_readonly(db
25300 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20  , zDbName)));.  
25310 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25320 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
25330 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
25340 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a  p_limit ?N?.**.*
25350 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
25360 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d  he soft heap lim
25370 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
25380 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a  nt thread.  The.
25390 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79  ** limit is only
253a0 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
253b0 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54  N is present.  T
253c0 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69  he previous limi
253d0 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  t.** is returned
253e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
253f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
25400 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  st_soft_heap_lim
25410 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  it(.  void * cli
25420 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
25430 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
25440 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
25450 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25460 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
25470 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c  int64 amt;.  Tcl
25480 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b  _WideInt N = -1;
25490 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26  .  if( objc!=1 &
254a0 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
254b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
254c0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
254d0 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72  v, "?N?");.    r
254e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
254f0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
25500 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
25510 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
25520 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
25530 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
25540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25550 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33  .  amt = sqlite3
25560 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
25570 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  64(N);.  Tcl_Set
25580 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25590 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
255a0 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74  Obj(amt));.  ret
255b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
255c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
255d0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
255e0 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  anup.**.** Call 
255f0 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65  the sqlite3_thre
25600 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a  ad_cleanup API..
25610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25620 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
25630 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
25640 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
25650 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
25660 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
25670 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
25680 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
25690 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
256a0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
256b0 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  D.  sqlite3_thre
256c0 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65  ad_cleanup();.#e
256d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
256e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
256f0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
25700 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
25710 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
25720 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65   a list of numbe
25730 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  rs which are the
25740 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66   PagerRefcount f
25750 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73  or all.** pagers
25760 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
25770 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
25780 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
25790 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
257a0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
257b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
257c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
257d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
257e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
257f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
25800 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
25810 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
25820 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
25830 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
25840 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
25850 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25860 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
25870 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
25880 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25890 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
258a0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
258b0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
258c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
258d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
258e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
258f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
25900 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
25910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25920 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
25930 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
25940 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
25950 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
25960 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
25970 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
25980 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
25990 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
259a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
259b0 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
259c0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
259d0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
259e0 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
259f0 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
25a00 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
25a10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
25a20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
25a30 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
25a40 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
25a50 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
25a60 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
25a70 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
25a80 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
25a90 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
25aa0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
25ab0 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
25ac0 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
25ad0 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
25ae0 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
25af0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
25b00 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
25b10 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
25b20 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
25b30 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
25b40 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
25b50 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
25b60 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
25b70 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
25b80 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
25b90 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
25ba0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
25bb0 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
25bc0 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
25bd0 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
25be0 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
25bf0 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
25c00 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
25c10 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
25c20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
25c30 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
25c40 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
25c50 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
25c60 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
25c70 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
25c80 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
25c90 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
25ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25cb0 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f 72 6b  LITE_TCLAPI work
25cc0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20  ing_64bit_int(. 
25cd0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25ce0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25cf0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25d00 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25d10 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25d20 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25d30 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25d40 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25d50 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25d60 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25d80 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25d90 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25da0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25db0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25dc0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  ts */.){.  Tcl_O
25dd0 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20  bj *pTestObj;.  
25de0 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b  int working = 0;
25df0 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54  ..  pTestObj = T
25e00 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
25e10 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32  (1000000*(i64)12
25e20 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72  34567890);.  wor
25e30 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63  king = strcmp(Tc
25e40 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73  l_GetString(pTes
25e50 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38  tObj), "12345678
25e60 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20  90000000")==0;. 
25e70 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
25e80 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54  t(pTestObj);.  T
25e90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
25ea0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
25eb0 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e  ooleanObj(workin
25ec0 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  g));.  return TC
25ed0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
25ee0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
25ef0 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  link_test.**.** 
25f00 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
25f10 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65   unregisters the
25f20 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64   primary VFS and
25f30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a   then registers.
25f40 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ** it back again
25f50 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
25f60 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c  to test the abil
25f70 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20  ity to register 
25f80 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f  a.** VFS when no
25f90 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c  ne are previousl
25fa0 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e  y registered, an
25fb0 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  d the ability to
25fc0 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20   .** unregister 
25fd0 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  the only availab
25fe0 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20  le VFS.  Ticket 
25ff0 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20  #2738.*/.static 
26000 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
26010 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73  I vfs_unlink_tes
26020 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
26030 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
26040 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
26050 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
26060 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
26070 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
26080 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
26090 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
260a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
260b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
260c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
260d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
260e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
260f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
26100 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
26110 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
26120 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
26130 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71  vfs *pMain;.  sq
26140 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
26150 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [20];.  sqlite3_
26160 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20  vfs one, two;.. 
26170 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
26180 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a  egister(0);   /*
26190 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e   Unregister of N
261a0 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ULL is harmless 
261b0 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  */.  one.zName =
261c0 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e   "__one";.  two.
261d0 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b  zName = "__two";
261e0 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
261f0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
26200 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67  ter with 2nd arg
26210 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20  ument of 0 does 
26220 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  not.  ** change 
26230 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a  the default VFS.
26240 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73    */.  pMain = s
26250 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
26260 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0);.  sqlite3_vf
26270 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
26280 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
26290 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
262a0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
262b0 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  nd(0) );.  sqlit
262c0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
262d0 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  &two, 0);.  asse
262e0 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
262f0 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
26300 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
26310 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20   /* We can find 
26320 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d  a VFS by its nam
26330 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
26340 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
26350 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
26360 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
26370 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
26380 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a  two")==&two );..
26390 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
263a0 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72  ite_vfs_register
263b0 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
263c0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
263d0 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a  changes the.  **
263e0 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76   default VFS, ev
263f0 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61  en if the 1st pa
26400 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78  rameter is an ex
26410 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69  istig VFS that i
26420 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  s.  ** previousl
26430 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
26440 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e  the non-default.
26450 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
26460 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
26470 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 1);.  assert(
26480 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
26490 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
264a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
264b0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
264c0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
264d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
264e0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
264f0 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65  &one );.  sqlite
26500 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
26510 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  two, 1);.  asser
26520 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
26530 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
26540 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
26550 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26560 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
26570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26580 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
26590 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20  ==&two );.  if( 
265a0 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  pMain ){.    sql
265b0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
265c0 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20  r(pMain, 1);.   
265d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
265e0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
265f0 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20  ")==&one );.    
26600 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26610 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
26620 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61  )==&two );.    a
26630 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
26640 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
26650 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n );.  }.  .  /*
26660 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61   Unlink the defa
26670 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74  ult VFS.  Repeat
26680 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65   until there are
26690 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20   no more VFSes. 
266a0 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a   ** registered..
266b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
266c0 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i<sizeof(apVfs)/
266d0 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
266e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
266f0 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
26700 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
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 61 73 73 65 72 74 28 20 61 70        assert( ap
26730 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
26740 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
26750 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
26760 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
26770 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
26780 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i]);.      asser
26790 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
267a0 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
267b0 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
267c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
267d0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
267e0 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  nd(0) );.  .  /*
267f0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61   Register the ma
26800 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65  in VFS as non-de
26810 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d  fault (will be m
26820 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e  ade default, sin
26830 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65  ce.  ** it'll be
26840 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e   the only one in
26850 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a   existence)..  *
26860 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
26870 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
26880 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  0);.  assert( sq
26890 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
268a0 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  )==pMain );.  . 
268b0 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20   /* Un-register 
268c0 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61  the main VFS aga
268d0 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e  in to restore an
268e0 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20   empty VFS list 
268f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
26900 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69  _unregister(pMai
26910 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  n);.  assert( 0=
26920 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
26930 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  d(0) );..  /* Re
26940 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69  link all VFSes i
26950 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
26960 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69   */  .  for(i=si
26970 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
26980 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20  of(apVfs[0])-1; 
26990 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
269a0 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
269b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
269c0 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
269d0 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  [i], 1);.      a
269e0 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
269f0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
26a00 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73  d(0) );.      as
26a10 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
26a20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26a30 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
26a40 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ) );.    }.  }..
26a50 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
26a60 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73  out sample VFSes
26a70 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  . */.  sqlite3_v
26a80 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
26a90 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
26aa0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
26ab0 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  wo);..  /* Unreg
26ac0 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74  istering a VFS t
26ad0 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65  hat is not curre
26ae0 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
26af0 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
26b00 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
26b10 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
26b20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
26b30 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20  egister(&two);. 
26b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26b50 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
26b60 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ")==0 );.  asser
26b70 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
26b80 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20  ind("__two")==0 
26b90 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
26ba0 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20  ld be left with 
26bb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66  the original def
26bc0 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73  ault VFS back as
26bd0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
26be0 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
26bf0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26c00 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20  (0)==pMain );.. 
26c10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
26c20 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
26c30 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
26c40 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
26c50 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65  TCL command atte
26c60 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64  mpts to vfs_find
26c70 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65   and vfs_registe
26c80 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  r when the.** sq
26c90 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
26ca0 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  () interface is 
26cb0 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61  failing.  All ca
26cc0 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e  lls should fail.
26cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
26ce0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73  QLITE_TCLAPI vfs
26cf0 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28 0a  _initfail_test(.
26d00 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26d10 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26d20 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26d30 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
26d40 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
26d50 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26d60 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26d70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26d80 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26d90 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26db0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26dc0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26dd0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26de0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26df0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
26e00 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f  te3_vfs one;.  o
26e10 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e  ne.zName = "__on
26e20 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  e";..  if( sqlit
26e30 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
26e40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26e50 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
26e60 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
26e70 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
26e80 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
26e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26ea0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
26eb0 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31  register(&one, 1
26ec0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
26ed0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72  _vfs_find(0) ) r
26ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26ef0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64  ;.}../*.** Saved
26f10 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63   VFSes.*/.static
26f20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70   sqlite3_vfs *ap
26f30 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20  Vfs[20];.static 
26f40 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f  int nVfs = 0;../
26f50 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
26f60 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
26f70 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74  l.**.** Unregist
26f80 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f  er all VFSes..*/
26f90 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
26fa0 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 75 6e  TE_TCLAPI vfs_un
26fb0 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20  register_all(.  
26fc0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26fd0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
26fe0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
26ff0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
27000 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27010 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27020 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27030 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27040 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27050 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27070 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27080 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27090 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
270a0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
270b0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
270c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
270d0 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20  raySize(apVfs); 
270e0 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b  i++){.    apVfs[
270f0 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  i] = sqlite3_vfs
27100 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66  _find(0);.    if
27110 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20  ( apVfs[i]==0 ) 
27120 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
27130 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
27140 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d  r(apVfs[i]);.  }
27150 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72  .  nVfs = i;.  r
27160 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27170 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
27180 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61  vfs_reregister_a
27190 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  ll.**.** Restore
271a0 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20   all VFSes that 
271b0 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69  were removed usi
271c0 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  ng vfs_unregiste
271d0 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a 2a 2a  r_all. Taking.**
271e0 20 63 61 72 65 20 74 6f 20 70 75 74 20 74 68 65   care to put the
271f0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 61 63   linked list bac
27200 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20 74 68  k together in th
27210 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
27220 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62 65 66  it was.** in bef
27230 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ore vfs_unregist
27240 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76 6f 6b  er_all was invok
27250 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
27260 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
27270 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61  vfs_reregister_a
27280 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
27290 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
272a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
272b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
272c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
272d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
272e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
272f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27300 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27310 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27320 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27340 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27350 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27360 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27370 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27380 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 6e  int i;.  for(i=n
27390 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Vfs-1; i>=0; i--
273a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
273b0 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
273c0 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  s[i], 1);.  }.  
273d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
273e0 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
273f0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
27400 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68  test DB.**.** Th
27410 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
27420 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
27430 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
27440 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
27450 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
27460 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
27470 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  same..*/.static 
27480 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
27490 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  I file_control_t
274a0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
274b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
274c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
274d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
274e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
274f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27500 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
27510 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
27520 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
27530 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
27540 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
27550 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
27560 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
27570 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
27580 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
27590 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
275a0 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
275b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
275c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
275d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
275e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
275f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
27600 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
27610 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
27620 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
27630 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
27640 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
27650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27660 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
27670 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
27680 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27690 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
276a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
276b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
276c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
276d0 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20  0, 0, &iArg);.  
276e0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
276f0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20  TE_NOTFOUND );. 
27700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
27710 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
27720 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53  notadatabase", S
27730 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
27740 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20  STATE, &iArg);. 
27750 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
27760 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
27770 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
27780 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
27790 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  in", -1, &iArg);
277a0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
277b0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
277c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
277d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
277e0 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69  , "temp", -1, &i
277f0 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
27800 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
27810 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  UND || rc==SQLIT
27820 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65  E_ERROR );..  re
27830 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
27840 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27850 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
27860 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a  sterrno_test DB.
27870 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
27880 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
27890 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
278a0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
278b0 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
278c0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
278d0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c   of the SQLITE_L
278e0 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a  AST_ERRNO verb..
278f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
27900 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
27910 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
27920 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
27930 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
27940 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
27950 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
27960 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
27970 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
27980 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
27990 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
279a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
279b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
279c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
279d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
279e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
279f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27a00 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27a10 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27a20 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
27a30 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
27a40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
27a50 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
27a60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
27a70 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
27a80 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
27a90 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
27aa0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
27ab0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
27ac0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
27ad0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27ae0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
27af0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
27b00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
27b10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
27b20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
27b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
27b40 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
27b50 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
27b60 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
27b70 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
27b80 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
27b90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
27ba0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
27bb0 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
27bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27bd0 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
27be0 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
27bf0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
27c00 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
27c10 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
27c20 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
27c30 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
27c40 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
27c50 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
27c60 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
27c70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
27c80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
27c90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
27ca0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27cb0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 64    file_control_d
27cc0 61 74 61 5f 76 65 72 73 69 6f 6e 20 44 42 20 44  ata_version DB D
27cd0 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BNAME.**.** This
27ce0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
27cf0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
27d00 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 69 74 68 20  le_control with 
27d10 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43  the.** SQLITE_FC
27d20 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
27d30 20 6f 70 63 6f 64 65 2c 20 72 65 74 75 72 6e 69   opcode, returni
27d40 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ng the result..*
27d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
27d60 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
27d70 63 6f 6e 74 72 6f 6c 5f 64 61 74 61 5f 76 65 72  control_data_ver
27d80 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61  sion(.  ClientDa
27d90 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27da0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27db0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27dc0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27dd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27de0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27df0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27e00 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27e10 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27e20 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27e30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27e40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27e50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27e60 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27e70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27e80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
27e90 56 65 72 73 3b 20 20 20 20 20 20 20 20 20 20 20  Vers;           
27ea0 20 20 2f 2a 20 64 61 74 61 20 76 65 72 73 69 6f    /* data versio
27eb0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  n */.  char *zDb
27ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ed0 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
27ee0 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
27ef0 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
27f00 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
27f30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
27f60 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
27f70 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75  de */.  char zBu
27f80 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
27f90 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
27fa0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
27fb0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
27fc0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 5b  , 1, objv, "DB [
27fd0 44 42 4e 41 4d 45 5d 22 29 3b 0a 20 20 20 20 72  DBNAME]");.    r
27fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27ff0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
28000 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
28010 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
28020 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
28030 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28040 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
28050 20 6f 62 6a 63 3d 3d 33 20 3f 20 54 63 6c 5f 47   objc==3 ? Tcl_G
28060 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
28070 29 20 3a 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  ) : NULL;..  rc 
28080 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
28090 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
280a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
280b0 41 5f 56 45 52 53 49 4f 4e 2c 20 28 76 6f 69 64  A_VERSION, (void
280c0 20 2a 29 26 69 56 65 72 73 29 3b 0a 20 20 69 66   *)&iVers);.  if
280d0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
280e0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
280f0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
28100 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
28110 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
28120 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
28140 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28150 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
28160 2c 22 25 75 22 2c 69 56 65 72 73 29 3b 0a 20 20  ,"%u",iVers);.  
28170 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
28180 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
28190 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  zBuf, TCL_VOLATI
281a0 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
281b0 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TCL_OK;.  }.}../
281c0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
281d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
281e0 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42  ksize_test DB DB
281f0 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20  NAME SIZE.**.** 
28200 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
28210 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
28220 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
28230 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
28240 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
28250 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
28260 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
28270 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
28280 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
28290 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
282a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
282b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
282c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
282d0 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c 69  size_test(.  Cli
282e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
282f0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
28300 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
28310 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
28320 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
28330 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
28340 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
28350 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
28360 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
28370 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
28380 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28390 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
283a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
283b0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
283c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
283d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  /.){.  int nSize
283e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
283f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 68         /* New ch
28400 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68  unk size */.  ch
28410 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28430 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22   Db name ("main"
28440 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a  , "temp" etc.) *
28450 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28470 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
28480 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
28490 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
284a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
284b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65  ile_control() re
284c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
284d0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
284e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
284f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28500 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20  bjv, "DB DBNAME 
28510 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75  SIZE");.    retu
28520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28530 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
28540 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
28550 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28560 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c  1]), &db) .   ||
28570 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
28580 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28590 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b  3], &nSize).  ){
285a0 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
285b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
285c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
285d0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
285e0 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a  zDb[0]=='\0' ) z
285f0 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63  Db = NULL;..  rc
28600 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
28610 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
28620 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
28630 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64 20  UNK_SIZE, (void 
28640 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28  *)&nSize);.  if(
28650 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
28660 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
28670 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
28680 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  ErrName(rc), TCL
28690 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
286a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
286b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
286c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
286d0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
286e0 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
286f0 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
28700 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
28710 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
28720 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
28730 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
28740 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45   .** with SQLITE
28750 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
28760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
28770 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
28780 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
28790 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nt_test(.  Clien
287a0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
287b0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
287c0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
287d0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
287e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
287f0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28800 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28810 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28820 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28830 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28850 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28860 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28870 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28880 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28890 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  ){.  Tcl_WideInt
288a0 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
288b0 20 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73       /* Hinted s
288c0 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ize */.  char *z
288d0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
288e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e           /* Db n
288f0 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ame ("main", "te
28900 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73  mp" etc.) */.  s
28910 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28930 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
28940 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63         /* file_c
28970 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20  ontrol() return 
28980 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  code */..  if( o
28990 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
289a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
289b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
289c0 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22  "DB DBNAME SIZE"
289d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
289e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
289f0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
28a00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
28a10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28a20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
28a30 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
28a40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
28a50 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a  ], &nSize).  ){.
28a60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28a70 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
28a80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28a90 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  bjv[2]);.  if( z
28aa0 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44  Db[0]=='\0' ) zD
28ab0 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  b = NULL;..  rc 
28ac0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
28ad0 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
28ae0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
28af0 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29  E_HINT, (void *)
28b00 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  &nSize);.  if( r
28b10 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  c ){.    Tcl_Set
28b20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
28b30 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
28b40 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
28b50 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
28b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28b70 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
28b80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
28b90 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
28ba0 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
28bb0 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54  t DB PWD.**.** T
28bc0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
28bd0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
28be0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
28bf0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
28c00 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
28c10 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
28c20 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
28c30 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
28c40 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
28c50 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
28c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
28c70 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
28c80 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
28c90 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
28ca0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28cb0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28cc0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28cd0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28ce0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28cf0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28d00 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28d10 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28d20 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28d30 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28d40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28d50 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28d60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28d70 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28d80 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28d90 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
28da0 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  b;.  .  if( objc
28db0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28dc0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28dd0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28de0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28e00 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
28e10 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
28e20 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57  [0], 0), " DB PW
28e30 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  D", 0);.    retu
28e40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28e50 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
28e60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
28e70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28e80 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
28e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28ea0 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65  ;.  }.  .#if !de
28eb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
28ec0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28ed0 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  E).#  if defined
28ee0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20  (__APPLE__).#   
28ef0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
28f00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28f10 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  YLE 1.#  else.# 
28f20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
28f30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28f40 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66  STYLE 0.#  endif
28f50 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
28f60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
28f70 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
28f80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
28f90 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74  {.    char *test
28fa0 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63  Path;.    int rc
28fb0 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a  ;.    int nPwd;.
28fc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28fd0 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70  zPwd;.    char p
28fe0 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20  roxyPath[400];. 
28ff0 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54     .    zPwd = T
29000 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
29010 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50  Obj(objv[2], &nP
29020 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  wd);.    if( siz
29030 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e  eof(proxyPath)<n
29040 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20  Pwd+20 ){.      
29050 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29060 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f  (interp, "PWD to
29070 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30  o big", (void*)0
29080 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
290a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
290b0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f  rintf(sizeof(pro
290c0 78 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61  xyPath), proxyPa
290d0 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
290e0 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
290f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
29100 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
29110 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
29120 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
29130 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
29140 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
29150 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
29160 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
29170 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
29180 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29190 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
291a0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
291b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
291c0 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
291d0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
291e0 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
291f0 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
29200 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
29210 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
29220 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
29230 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
29240 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
29250 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
29280 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
29290 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
292a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
292b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
292c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
292d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
292e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
292f0 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
29300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29310 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
29320 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
29330 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
29340 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
29350 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
29360 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
29370 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
29380 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
29390 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
293a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
293b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
293c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
293d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
293e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
293f0 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
29400 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
29410 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
29420 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
29430 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
29440 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
29450 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
29460 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
29470 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
29480 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
29490 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
294a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
294b0 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
294c0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
294d0 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e  v_retry(.  Clien
294e0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
294f0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
29500 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
29510 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
29520 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29530 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
29540 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
29550 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
29560 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
29570 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
29580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29590 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
295a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
295b0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
295c0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
295d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
295e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
295f0 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a  t a[2];.  char z
29600 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
29610 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
29620 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29630 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
29640 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
29650 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
29660 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
29670 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
29680 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22  DB NRETRY DELAY"
29690 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
296a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
296b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
296c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
296d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
296e0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
296f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29700 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
29710 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29720 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61  erp, objv[2], &a
29730 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [0]) ) return TC
29740 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
29750 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
29760 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
29770 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72  , &a[1]) ) retur
29780 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
29790 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
297a0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
297b0 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
297c0 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20  WIN32_AV_RETRY, 
297d0 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c  (void*)a);.  sql
297e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
297f0 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
29800 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d  %d %d", rc, a[0]
29810 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[1]);.  Tcl_A
29820 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29830 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
29840 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29850 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
29860 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
29870 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
29880 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a 2a 2a 20 54  andle DB.**.** T
29890 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
298a0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
298b0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
298c0 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
298d0 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
298e0 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c  _WIN32_GET_HANDL
298f0 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
29900 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
29910 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
29920 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44  andle(.  ClientD
29930 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
29940 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
29950 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
29960 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
29970 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29980 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
29990 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
299a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
299b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
299c0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
299d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
299e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
299f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
29a00 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
29a10 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
29a20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
29a30 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44    int rc;.  HAND
29a40 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  LE hFile = NULL;
29a50 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
29a60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
29a70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
29a80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
29a90 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
29aa0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
29ab0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
29ac0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
29ad0 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
29ae0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29af0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29b00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29b10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29b20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29b30 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
29b40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29b50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
29b60 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
29b70 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
29b80 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
29b90 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  NDLE,.          
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29    (void*)&hFile)
29bc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
29bd0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
29be0 7a 2c 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20  z, "%d %p", rc, 
29bf0 28 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20  (void*)hFile);. 
29c00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29c10 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
29c20 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
29c30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
29c40 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
29c50 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
29c60 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e  et_handle DB HAN
29c70 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  DLE.**.** This T
29c80 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
29c90 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
29ca0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
29cb0 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
29cc0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
29cd0 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63  2_SET_HANDLE opc
29ce0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29cf0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
29d00 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
29d10 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
29d20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
29d30 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
29d40 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
29d50 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
29d60 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
29d70 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
29d80 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
29d90 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
29da0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
29db0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29dd0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29de0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
29df0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
29e00 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
29e10 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
29e20 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
29e30 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
29e40 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
29e50 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
29e60 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
29e70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
29e80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
29e90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
29ea0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
29eb0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
29ec0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
29ed0 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
29ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29ef0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29f00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29f10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29f20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29f30 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
29f40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29f50 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
29f60 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
29f70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
29f80 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
29f90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29fa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
29fb0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29fc0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
29fd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
29fe0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2a010 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
2a020 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2a030 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
2a040 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
2a050 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
2a060 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2a070 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
2a080 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a090 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
2a0a0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
2a0b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
2a0c0 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
2a0d0 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
2a0e0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
2a0f0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
2a100 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
2a110 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
2a120 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
2a130 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
2a140 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
2a150 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2a160 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
2a170 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65  sist_wal(.  Clie
2a180 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2a190 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2a1a0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2a1b0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2a1c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a1d0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2a1e0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a1f0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a200 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a210 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2a220 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a230 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2a240 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2a250 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2a260 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2a270 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2a280 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2a290 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63  nt bPersist;.  c
2a2a0 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
2a2b0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
2a2c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2a2d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2a2e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2a2f0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
2a300 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2a310 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
2a320 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
2a330 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a340 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a350 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a360 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2a370 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2a380 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
2a390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a3a0 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
2a3b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2a3c0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72  , objv[2], &bPer
2a3d0 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54  sist) ) return T
2a3e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2a3f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
2a400 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
2a410 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
2a420 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a  SIST_WAL, (void*
2a430 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73  )&bPersist);.  s
2a440 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2a450 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
2a460 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73  d %d", rc, bPers
2a470 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ist);.  Tcl_Appe
2a480 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a490 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
2a4a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
2a4b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
2a4c0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
2a4d0 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
2a4e0 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c  write DB PSOW-FL
2a4f0 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
2a500 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
2a510 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
2a520 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
2a530 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
2a540 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
2a550 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f  SAFE_OVERWRITE o
2a560 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
2a570 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2a580 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
2a590 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
2a5a0 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ite(.  ClientDat
2a5b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2a5c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2a5d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2a5e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2a5f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a600 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a610 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a620 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a630 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2a640 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2a650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2a660 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2a670 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2a680 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2a690 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2a6a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2a6b0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b  int rc;.  int b;
2a6c0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
2a6d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
2a6e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2a6f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a700 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2a710 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
2a720 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
2a730 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
2a740 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
2a750 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2a760 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a770 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2a780 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2a790 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2a7a0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
2a7b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a7c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
2a7d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2a7e0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2a7f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2a800 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
2a810 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2a820 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54  ol(db,NULL,SQLIT
2a830 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
2a840 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69  E_OVERWRITE,(voi
2a850 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65  d*)&b);.  sqlite
2a860 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2a870 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
2a880 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f  , rc, b);.  Tcl_
2a890 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2a8a0 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
2a8b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2a8c0 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
2a8d0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
2a8e0 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44  ontrol_vfsname D
2a8f0 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
2a900 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
2a910 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
2a920 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65  he stack of VFSe
2a930 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a940 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66   SQLITE_TCLAPI f
2a950 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
2a960 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ame(.  ClientDat
2a970 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2a980 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2a990 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2a9a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2a9b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a9c0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a9d0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a9e0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a9f0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2aa00 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2aa10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2aa20 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2aa30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2aa40 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2aa50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2aa60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2aa70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
2aa80 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
2aa90 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d  char *zVfsName =
2aaa0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
2aab0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
2aac0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2aad0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2aae0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2aaf0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
2ab00 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
2ab10 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
2ab20 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44  , 0), " DB ?AUXD
2ab30 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  B?", 0);.    ret
2ab40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ab50 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2ab60 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2ab70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ab80 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2ab90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2aba0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
2abb0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
2abc0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
2abd0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2abe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   }.  sqlite3_fil
2abf0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
2ac00 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
2ac10 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69  NTL_VFSNAME,(voi
2ac20 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  d*)&zVfsName);. 
2ac30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ac40 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61  t(interp, zVfsNa
2ac50 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2ac60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56   sqlite3_free(zV
2ac70 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  fsName);.  retur
2ac80 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
2ac90 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
2aca0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70  ile_control_temp
2acb0 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58  filename DB ?AUX
2acc0 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  DB?.**.** Return
2acd0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
2ace0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2acf0 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  lename.*/.static
2ad00 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2ad10 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
2ad20 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20  tempfilename(.  
2ad30 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2ad40 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2ad50 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2ad60 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2ad70 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2ad80 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2ad90 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2ada0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2adb0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2adc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2add0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ade0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2adf0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2ae00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2ae10 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2ae20 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
2ae30 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2ae40 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
2ae50 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
2ae60 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  TName = 0;..  if
2ae70 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
2ae80 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2ae90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2aea0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2aeb0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2aec0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
2aed0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2aee0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
2aef0 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a  B ?AUXDB?", 0);.
2af00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2af10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2af20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2af30 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2af40 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2af50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2af60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2af70 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
2af80 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
2af90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2afa0 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [2]);.  }.  sqli
2afb0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2afc0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  (db, zDbName, SQ
2afd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
2afe0 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29  ILENAME, (void*)
2aff0 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  &zTName);.  Tcl_
2b000 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2b010 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68  erp, zTName, (ch
2b020 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
2b030 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
2b040 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2b050 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
2b060 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76  cmd:   sqlite3_v
2b070 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20  fs_list.**.**   
2b080 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73  Return a tcl lis
2b090 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
2b0a0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65   names of all re
2b0b0 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a  gistered vfs's..
2b0c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2b0d0 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f  LITE_TCLAPI vfs_
2b0e0 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  list(.  ClientDa
2b0f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2b100 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2b110 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2b120 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2b130 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2b140 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2b150 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2b160 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2b170 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2b180 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2b190 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2b1a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2b1b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2b1c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2b1d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2b1e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2b1f0 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Vfs;.  Tcl_Obj *
2b200 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
2b210 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  j();.  if( objc!
2b220 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
2b230 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2b240 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
2b250 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2b260 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
2b270 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66  (pVfs=sqlite3_vf
2b280 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b  s_find(0); pVfs;
2b290 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78   pVfs=pVfs->pNex
2b2a0 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  t){.    Tcl_List
2b2b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b2c0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
2b2d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2b2e0 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29  pVfs->zName, -1)
2b2f0 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
2b300 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2b310 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72  , pRet);.  retur
2b320 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
2b330 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
2b340 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20  qlite3_limit DB 
2b350 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54  ID VALUE.**.** T
2b360 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
2b370 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
2b380 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65  _limit interface
2b390 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
2b3a0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
2b3b0 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
2b3c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2b3d0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2b3e0 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74  _limit(.  Client
2b3f0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2b400 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2b410 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2b420 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2b430 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b440 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2b450 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2b460 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2b470 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2b480 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2b490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b4a0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2b4b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2b4c0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2b4d0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2b4e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2b4f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61  .  int rc;.  sta
2b500 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2b510 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
2b520 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64  ame;.     int id
2b530 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a  ;.  } aId[] = {.
2b540 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2b550 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  MIT_LENGTH",    
2b560 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2b570 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
2b580 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2b590 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2b5a0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20  IT_SQL_LENGTH", 
2b5b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2b5c0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
2b5d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2b5e0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
2b5f0 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20  T_COLUMN",      
2b600 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2b610 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
2b620 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2b630 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2b640 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20  _EXPR_DEPTH",   
2b650 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2b660 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
2b670 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b680 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2b690 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22  COMPOUND_SELECT"
2b6a0 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
2b6b0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2b6c0 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  CT      },.    {
2b6d0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
2b6e0 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20  DBE_OP",        
2b6f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2b700 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
2b710 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2b720 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  "SQLITE_LIMIT_FU
2b730 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20  NCTION_ARG",    
2b740 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2b750 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
2b760 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b770 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
2b780 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20  ACHED",         
2b790 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2b7a0 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
2b7b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
2b7c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
2b7d0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22  _PATTERN_LENGTH"
2b7e0 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
2b7f0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
2b800 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  TH  },.    { "SQ
2b810 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
2b820 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20  BLE_NUMBER",    
2b830 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
2b840 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
2b850 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
2b860 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
2b870 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
2b880 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
2b890 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
2b8a0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2b8b0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
2b8c0 54 48 52 45 41 44 53 22 2c 20 20 20 20 20 20 53  THREADS",      S
2b8d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
2b8e0 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
2b8f0 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   },.    .    /* 
2b900 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73  Out of range tes
2b910 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b  t cases */.    {
2b920 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
2b930 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20  OOSMALL",       
2b940 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20       -1,        
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2b970 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
2b980 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20  OBIG",          
2b990 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2b9a0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2b  _WORKER_THREADS+
2b9b0 31 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20  1     },.  };.  
2b9c0 69 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b 0a 20  int i, id = 0;. 
2b9d0 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73   int val;.  cons
2b9e0 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20  t char *zId;..  
2b9f0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
2ba00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2ba10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2ba20 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2ba30 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
2ba40 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
2ba50 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
2ba60 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55  0), " DB ID VALU
2ba70 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
2ba80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ba90 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2baa0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2bab0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2bac0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2bad0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bae0 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zId = Tcl_GetStr
2baf0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2bb00 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2bb10 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
2bb20 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
2bb30 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c   if( strcmp(zId,
2bb40 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d   aId[i].zName)==
2bb50 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20  0 ){.      id = 
2bb60 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20  aId[i].id;.     
2bb70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2bb80 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
2bb90 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
2bba0 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  d[0]) ){.    Tcl
2bbb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2bbc0 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  terp, "unknown l
2bbd0 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49  imit type: ", zI
2bbe0 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  d, (char*)0);.  
2bbf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2bc00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2bc10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2bc20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2bc30 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
2bc40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
2bc50 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  = sqlite3_limit(
2bc60 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20  db, id, val);.  
2bc70 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2bc80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2bc90 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
2bca0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
2bcb0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2bcc0 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
2bcd0 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  e.**.** Save the
2bce0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73   state of the ps
2bcf0 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
2bd00 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  er generator..**
2bd10 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
2bd20 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73  e, verify that s
2bd30 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2bd40 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77  rol works even w
2bd50 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  hen.** called wi
2bd60 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e  th an out-of-ran
2bd70 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  ge opcode..*/.st
2bd80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2bd90 54 43 4c 41 50 49 20 73 61 76 65 5f 70 72 6e 67  TCLAPI save_prng
2bda0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
2bdb0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2bdc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2bdd0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2bde0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2bdf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2be00 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2be10 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2be20 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2be30 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2be40 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2be50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2be60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2be70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2be80 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2be90 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2bea0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
2beb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2bec0 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72  l(9999);.  asser
2bed0 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63  t( rc==0 );.  rc
2bee0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
2bef0 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61  control(-1);.  a
2bf00 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
2bf10 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2bf20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2bf30 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
2bf40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2bf50 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
2bf60 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e  md:  restore_prn
2bf70 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
2bf80 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2bf90 41 50 49 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  API restore_prng
2bfa0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
2bfb0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2bfc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2bfd0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2bfe0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2bff0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c000 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2c010 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2c020 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2c030 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2c040 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2c050 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c060 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2c070 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2c080 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2c090 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2c0a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2c0b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2c0c0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
2c0d0 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e  STORE);.  return
2c0e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
2c0f0 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f   tclcmd:  reset_
2c100 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74  prng_state.*/.st
2c110 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2c120 54 43 4c 41 50 49 20 72 65 73 65 74 5f 70 72 6e  TCLAPI reset_prn
2c130 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
2c140 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2c150 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2c160 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2c170 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2c180 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2c190 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2c1a0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2c1b0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2c1c0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2c1d0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2c1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c1f0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2c200 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2c210 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2c220 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2c230 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  ){.  sqlite3_ran
2c240 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
2c250 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2c260 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2c270 70 72 6e 67 5f 73 65 65 64 20 49 4e 54 20 3f 44  prng_seed INT ?D
2c280 42 3f 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20  B?.**.** Set up 
2c290 74 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  the SQLITE_TESTC
2c2a0 54 52 4c 5f 50 52 4e 47 5f 53 45 45 44 20 70 72  TRL_PRNG_SEED pr
2c2b0 61 67 6d 61 20 77 69 74 68 20 70 61 72 61 6d 65  agma with parame
2c2c0 74 65 72 20 49 4e 54 20 61 6e 64 20 44 42 2e 0a  ter INT and DB..
2c2d0 2a 2a 20 49 4e 54 20 69 73 20 61 6e 20 69 6e 74  ** INT is an int
2c2e0 65 67 65 72 2e 20 20 44 42 20 69 73 20 61 20 64  eger.  DB is a d
2c2f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2c300 6f 6e 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  on, or a NULL po
2c310 69 6e 74 65 72 20 69 66 0a 2a 2a 20 6f 6d 69 74  inter if.** omit
2c320 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ted..**.** When 
2c330 49 4e 54 21 3d 30 20 61 6e 64 20 44 42 21 3d 30  INT!=0 and DB!=0
2c340 2c 20 73 65 74 20 74 68 65 20 50 52 4e 47 20 73  , set the PRNG s
2c350 65 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  eed to the value
2c360 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   of the schema.*
2c370 2a 20 63 6f 6f 6b 69 65 20 66 6f 72 20 44 42 2c  * cookie for DB,
2c380 20 6f 72 20 74 6f 20 49 4e 54 20 69 66 20 74 68   or to INT if th
2c390 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
2c3a0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 7a 65  happens to be ze
2c3b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ro..**.** When I
2c3c0 4e 54 21 3d 30 20 61 6e 64 20 44 42 3d 3d 30 2c  NT!=0 and DB==0,
2c3d0 20 73 65 74 20 74 68 65 20 50 52 4e 47 20 73 65   set the PRNG se
2c3e0 65 64 20 74 6f 20 6a 75 73 74 20 49 4e 54 2e 0a  ed to just INT..
2c3f0 2a 2a 0a 2a 2a 20 49 66 20 49 4e 54 3d 3d 30 20  **.** If INT==0 
2c400 61 6e 64 20 44 42 3d 3d 30 20 74 68 65 6e 20 75  and DB==0 then u
2c410 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  se the default p
2c420 72 6f 63 65 64 75 72 65 20 6f 66 20 63 61 6c 6c  rocedure of call
2c430 69 6e 67 20 74 68 65 0a 2a 2a 20 78 52 61 6e 64  ing the.** xRand
2c440 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 6e  omness method on
2c450 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
2c460 20 74 6f 20 67 65 74 20 74 68 65 20 50 52 4e 47   to get the PRNG
2c470 20 73 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   seed..*/.static
2c480 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2c490 50 49 20 70 72 6e 67 5f 73 65 65 64 28 0a 20 20  PI prng_seed(.  
2c4a0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2c4b0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2c4c0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2c4d0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2c4e0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2c4f0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2c500 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2c510 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2c520 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2c530 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2c540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c550 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2c560 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2c570 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2c580 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2c590 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20  s */.){.  int i 
2c5a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
2c5b0 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  db = 0;.  if( ob
2c5c0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
2c5d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2c5e0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2c5f0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 45 45 44 20   1, objv, "SEED 
2c600 3f 44 42 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ?DB?");.    retu
2c610 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c620 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
2c630 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2c640 2c 6f 62 6a 76 5b 30 5d 2c 26 69 29 20 29 20 72  ,objv[0],&i) ) r
2c650 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c660 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 26  .  if( objc==3 &
2c670 26 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  & getDbPointer(i
2c680 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2c690 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
2c6a0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2c6b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c6c0 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2c6d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2c6e0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 45 45  ESTCTRL_PRNG_SEE
2c6f0 44 2c 20 69 2c 20 64 62 29 3b 0a 20 20 72 65 74  D, i, db);.  ret
2c700 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2c710 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61  *.** tclcmd:  da
2c720 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
2c730 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  rrupt.**.** Indi
2c740 63 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61  cate that databa
2c750 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 62  se files might b
2c760 65 20 63 6f 72 72 75 70 74 2e 20 49 6e 20 6f 74  e corrupt. In ot
2c770 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20 74  her words, set t
2c780 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61  he normal.** sta
2c790 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e  te of operation.
2c7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2c7b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61 74  QLITE_TCLAPI dat
2c7c0 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72  abase_may_be_cor
2c7d0 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  rupt(.  ClientDa
2c7e0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2c7f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2c800 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2c810 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2c820 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2c830 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2c840 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2c850 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2c860 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2c870 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2c880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2c890 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2c8a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2c8b0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2c8c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2c8d0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2c8e0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2c8f0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
2c900 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65 74 75  RUPT, 0);.  retu
2c910 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
2c920 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74 61  ** tclcmd:  data
2c930 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75  base_never_corru
2c940 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  pt.**.** Indicat
2c950 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  e that database 
2c960 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  files are always
2c970 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 54 68   well-formed. Th
2c980 69 73 20 65 6e 61 62 6c 65 73 0a 2a 2a 20 65 78  is enables.** ex
2c990 74 72 61 20 61 73 73 65 72 74 28 29 20 73 74 61  tra assert() sta
2c9a0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74 65 73  tements that tes
2c9b0 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  t conditions tha
2c9c0 74 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75  t are always tru
2c9d0 65 0a 2a 2a 20 66 6f 72 20 77 65 6c 6c 2d 66 6f  e.** for well-fo
2c9e0 72 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  rmed databases..
2c9f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2ca00 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61 74 61  LITE_TCLAPI data
2ca10 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75  base_never_corru
2ca20 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  pt(.  ClientData
2ca30 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2ca40 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2ca50 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
2ca60 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
2ca70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2ca80 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2ca90 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2caa0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2cab0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2cac0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2cad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2cae0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2caf0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2cb00 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2cb10 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2cb20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2cb30 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2cb40 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
2cb50 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  PT, 1);.  return
2cb60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2cb70 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
2cb80 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
2cb90 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2cba0 41 50 49 20 74 65 73 74 5f 70 63 61 63 68 65 5f  API test_pcache_
2cbb0 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44  stats(.  ClientD
2cbc0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2cbd0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2cbe0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2cbf0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2cc00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2cc10 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2cc20 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2cc30 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2cc40 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2cc50 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2cc60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cc70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2cc80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2cc90 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2cca0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2ccb0 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69  .  int nMin;.  i
2ccc0 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e  nt nMax;.  int n
2ccd0 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e  Current;.  int n
2cce0 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63  Recyclable;.  Tc
2ccf0 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
2cd00 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61  sqlite3PcacheSta
2cd10 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e  ts(&nCurrent, &n
2cd20 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65  Max, &nMin, &nRe
2cd30 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52  cyclable);..  pR
2cd40 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
2cd50 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2cd60 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2cd70 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
2cd80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75  NewStringObj("cu
2cd90 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20  rrent", -1));.  
2cda0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2cdb0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2cdc0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2cdd0 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b  tObj(nCurrent));
2cde0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2cdf0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2ce00 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2ce10 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22  wStringObj("max"
2ce20 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2ce30 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2ce40 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2ce50 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2ce60 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Max));.  Tcl_Lis
2ce70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2ce80 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2ce90 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2cea0 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  ("min", -1));.  
2ceb0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2cec0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ced0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2cee0 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54  tObj(nMin));.  T
2cef0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2cf00 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2cf10 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
2cf20 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62  ingObj("recyclab
2cf30 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  le", -1));.  Tcl
2cf40 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2cf50 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2cf60 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2cf70 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b  j(nRecyclable));
2cf80 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
2cf90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
2cfa0 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  t);..  return TC
2cfb0 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  L_OK;.}..#ifdef 
2cfc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
2cfd0 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
2cfe0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c  ic void test_unl
2cff0 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f  ock_notify_cb(vo
2d000 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e  id **aArg, int n
2d010 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  Arg){.  int ii;.
2d020 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2d030 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Arg; ii++){.    
2d040 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f  Tcl_EvalEx((Tcl_
2d050 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69  Interp *)aArg[ii
2d060 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  ], "unlock_notif
2d070 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  y", -1, TCL_EVAL
2d080 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  _GLOBAL);.  }.}.
2d090 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d0a0 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
2d0b0 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  OTIFY */../*.** 
2d0c0 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2d0d0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64  _unlock_notify d
2d0e0 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  b.*/.#ifdef SQLI
2d0f0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
2d100 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69  _NOTIFY.static i
2d110 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2d120 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
2d130 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ify(.  ClientDat
2d140 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2d150 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2d160 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d170 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2d180 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2d190 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2d1a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2d1b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2d1c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2d1d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2d1e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2d1f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2d200 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2d210 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2d220 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2d230 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2d240 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2d250 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2d260 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
2d270 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d280 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2d290 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2d2a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2d2b0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2d2c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d2d0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
2d2e0 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
2d2f0 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c  ify(db, test_unl
2d300 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28  ock_notify_cb, (
2d310 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a  void *)interp);.
2d320 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2d330 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2d340 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
2d350 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2d360 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d370 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74  .#endif../*.** t
2d380 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2d390 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
2d3a0 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74  b ?NAME?.*/.stat
2d3b0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2d3c0 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 63 68  LAPI test_wal_ch
2d3d0 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65  eckpoint(.  Clie
2d3e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2d3f0 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2d400 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d410 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d420 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d430 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d440 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d450 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2d460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d470 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2d480 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2d490 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2d4a0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2d4b0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
2d4c0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
2d4d0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
2d4e0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
2d4f0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2d500 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2d510 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2d520 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20   "DB ?NAME?");. 
2d530 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2d540 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
2d550 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2d560 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2d570 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2d580 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2d590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2d5a0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
2d5b0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
2d5c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2d5d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2d5e0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
2d5f0 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
2d600 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2d610 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
2d620 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2d630 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
2d640 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2d650 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
2d660 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
2d670 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45  point_v2 db MODE
2d680 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68   ?NAME?.**.** Th
2d690 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73  is command calls
2d6a0 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f   the wal_checkpo
2d6b0 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  int_v2() functio
2d6c0 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  n with the speci
2d6d0 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67  fied.** mode arg
2d6e0 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20  ument (passive, 
2d6f0 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29  full or restart)
2d700 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68  . If present, th
2d710 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  e database name.
2d720 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65  ** NAME is passe
2d730 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2d740 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f  argument to wal_
2d750 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e  checkpoint_v2().
2d760 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41   If it the.** NA
2d770 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ME argument is n
2d780 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55  ot present, a NU
2d790 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61  LL pointer is pa
2d7a0 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  ssed instead..**
2d7b0 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b  .** If wal_check
2d7c0 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72  point_v2() retur
2d7d0 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68  ns any value oth
2d7e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
2d7f0 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  USY or.** SQLITE
2d800 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63  _OK, then this c
2d810 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54  ommand returns T
2d820 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63  CL_ERROR. The Tc
2d830 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a  l result is set.
2d840 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ** to the error 
2d850 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64  message obtained
2d860 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
2d870 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  rmsg()..**.** Ot
2d880 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f  herwise, this co
2d890 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  mmand returns a 
2d8a0 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e  list of three in
2d8b0 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
2d8c0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20  t integer.** is 
2d8d0 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  1 if SQLITE_BUSY
2d8e0 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f   was returned, o
2d8f0 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54  r 0 otherwise. T
2d900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2d910 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65   integers.** are
2d920 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
2d930 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74  rned via the out
2d940 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62  put parameters b
2d950 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  y wal_checkpoint
2d960 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e  _v2() -.** the n
2d970 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
2d980 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74  in the log and t
2d990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
2d9a0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a  mes in the log.*
2d9b0 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  * that have been
2d9c0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
2d9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2d9e0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2d9f0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
2da00 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
2da10 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2da20 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2da30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2da40 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2da50 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2da60 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2da70 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2da80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2da90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2daa0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2dab0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2dac0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2dad0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2dae0 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
2daf0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2db00 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d  nt rc;..  int eM
2db10 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20  ode;.  int nLog 
2db20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43  = -555;.  int nC
2db30 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63  kpt = -555;.  Tc
2db40 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
2db50 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d 6f  const char * aMo
2db60 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69 76  de[] = { "passiv
2db70 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65 73  e", "full", "res
2db80 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61 74 65  tart", "truncate
2db90 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72 74  ", 0 };.  assert
2dba0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
2dbb0 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
2dbc0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2dbd0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
2dbe0 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
2dbf0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
2dc00 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
2dc10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2dc20 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
2dc30 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 0a 20  RUNCATE==3 );.. 
2dc40 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
2dc50 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
2dc60 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2dc70 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2dc80 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f   "DB MODE ?NAME?
2dc90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2dca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2dcb0 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
2dcc0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
2dcd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
2dce0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2dcf0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2dd00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2dd10 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 7c 7c  bjv[1]), &db) ||
2dd20 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f 4b 21   (.      TCL_OK!
2dd30 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
2dd40 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  bj(0, objv[2], &
2dd50 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54 43 4c  eMode).   && TCL
2dd60 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 64 65  _OK!=Tcl_GetInde
2dd70 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
2dd80 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c   objv[2], aMode,
2dd90 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f   "mode", 0, &eMo
2dda0 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20 20 72  de) .  )){.    r
2ddb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ddc0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2ddd0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
2dde0 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
2ddf0 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e  eMode, &nLog, &n
2de00 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21  Ckpt);.  if( rc!
2de10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
2de20 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
2de30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2de40 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69  *zErrCode = sqli
2de50 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a  te3ErrName(rc);.
2de60 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
2de70 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
2de80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2de90 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 43 6f  t(interp, zErrCo
2dea0 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68 61 72  de, " - ", (char
2deb0 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2dec0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
2ded0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2dee0 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
2def0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
2df00 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2df10 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2df20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2df30 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42  Obj(rc==SQLITE_B
2df40 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c  USY?1:0));.  Tcl
2df50 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2df60 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2df70 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2df80 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f  j(nLog));.  Tcl_
2df90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2dfa0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2dfb0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2dfc0 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f  (nCkpt));.  Tcl_
2dfd0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2dfe0 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72  erp, pRet);..  r
2dff0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2e000 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2e010 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
2e020 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 56 41  checkpoint db VA
2e030 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LUE.*/.static in
2e040 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2e050 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65  test_wal_autoche
2e060 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
2e070 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2e080 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
2e090 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2e0a0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2e0b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2e0c0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2e0d0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2e0e0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2e0f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e100 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2e110 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2e120 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2e130 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2e140 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2e150 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2e160 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66 28 20  t iVal;...  if( 
2e170 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
2e180 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2e190 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2e1a0 20 22 44 42 20 56 41 4c 55 45 22 29 3b 0a 20 20   "DB VALUE");.  
2e1b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e1c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
2e1d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2e1e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2e1f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2e200 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49   .   || Tcl_GetI
2e210 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a  ntFromObj(0, obj
2e220 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20 20 29  v[2], &iVal).  )
2e230 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2e240 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
2e250 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  c = sqlite3_wal_
2e260 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
2e270 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63 6c 5f  b, iVal);.  Tcl_
2e280 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2e290 72 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rp);.  if( rc!=S
2e2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e2b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
2e2c0 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72  Code = sqlite3Er
2e2d0 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54  rName(rc);.    T
2e2e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2e2f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
2e300 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43 6f 64  tringObj(zErrCod
2e310 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  e, -1));.    ret
2e320 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e330 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
2e340 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
2e350 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c  clcmd:  test_sql
2e360 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54  ite3_log ?SCRIPT
2e370 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ?.*/.static stru
2e380 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b  ct LogCallback {
2e390 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70  .  Tcl_Interp *p
2e3a0 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  Interp;.  Tcl_Ob
2e3b0 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61  j *pObj;.} logca
2e3c0 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b  llback = {0, 0};
2e3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f  .static void xLo
2e3e0 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  gcallback(void *
2e3f0 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c  unused, int err,
2e400 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
2e410 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20  Tcl_Obj *pNew = 
2e420 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2e430 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
2e440 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  j);.  Tcl_IncrRe
2e450 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20  fCount(pNew);.  
2e460 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2e470 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20  dElement(.      
2e480 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
2e490 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
2e4a0 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d  3ErrName(err), -
2e4b0 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69  1).  );.  Tcl_Li
2e4c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2e4d0 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f  nt(0, pNew, Tcl_
2e4e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73  NewStringObj(zMs
2e4f0 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  g, -1));.  Tcl_E
2e500 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c  valObjEx(logcall
2e510 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e  back.pInterp, pN
2e520 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  ew, TCL_EVAL_GLO
2e530 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
2e540 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
2e550 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
2e560 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  }.static int SQL
2e570 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2e580 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43  sqlite3_log(.  C
2e590 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2e5a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2e5b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2e5c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2e5d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2e5e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2e5f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2e600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e610 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2e620 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2e630 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2e640 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2e650 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  nts */.){.  if( 
2e660 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63  objc>2 ){.    Tc
2e670 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2e680 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2e690 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72  "SCRIPT");.    r
2e6a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e6b0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61  .  }.  if( logca
2e6c0 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20  llback.pObj ){. 
2e6d0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2e6e0 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  unt(logcallback.
2e6f0 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61  pObj);.    logca
2e700 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b  llback.pObj = 0;
2e710 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
2e720 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20  .pInterp = 0;.  
2e730 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
2e740 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c  (SQLITE_CONFIG_L
2e750 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28 76  OG, (void*)0, (v
2e760 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69  oid*)0);.  }.  i
2e770 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20  f( objc>1 ){.   
2e780 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
2e790 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20  j = objv[1];.   
2e7a0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2e7b0 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  t(logcallback.pO
2e7c0 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  bj);.    logcall
2e7d0 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69  back.pInterp = i
2e7e0 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74  nterp;.    sqlit
2e7f0 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
2e800 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f  _CONFIG_LOG, xLo
2e810 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  gcallback, (void
2e820 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *)0);.  }.  retu
2e830 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2e840 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70  .**     tcl_objp
2e850 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20  roc COMMANDNAME 
2e860 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75  ARGS....**.** Ru
2e870 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  n a TCL command 
2e880 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f  using its objPro
2e890 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68  c interface.  Th
2e8a0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a  row an error if.
2e8b0 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68  ** the command h
2e8c0 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e  as no objProc in
2e8d0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
2e8e0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2e8f0 4c 41 50 49 20 72 75 6e 41 73 4f 62 6a 50 72 6f  LAPI runAsObjPro
2e900 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
2e910 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2e920 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2e930 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2e940 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2e950 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  ].){.  Tcl_CmdIn
2e960 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66  fo cmdInfo;.  if
2e970 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
2e980 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2e990 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2e9a0 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  , "COMMAND ...")
2e9b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2e9c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2e9d0 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
2e9e0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
2e9f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ea00 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
2ea10 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2ea20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2ea30 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
2ea40 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
2ea50 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
2ea60 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
2ea70 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2ea80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea90 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a   if( cmdInfo.obj
2eaa0 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54  Proc==0 ){.    T
2eab0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2eac0 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
2ead0 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a   has no objProc:
2eae0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54   ",.           T
2eaf0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2eb00 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
2eb10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2eb20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
2eb30 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a  turn cmdInfo.obj
2eb40 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a  Proc(cmdInfo.obj
2eb50 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65  ClientData, inte
2eb60 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76  rp, objc-1, objv
2eb70 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  +1);.}..#ifndef 
2eb80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2eb90 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e  AIN./*.** WARNIN
2eba0 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  G: The following
2ebb0 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74   function, print
2ebc0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
2ebd0 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a  () is an exact.*
2ebe0 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c  * copy of exampl
2ebf0 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e  e code from eqp.
2ec00 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49  in (eqp.html). I
2ec10 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d  f this code is m
2ec20 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e  odified,.** then
2ec30 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
2ec40 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f  on copy needs to
2ec50 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
2ec60 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  well..*/./*.** A
2ec70 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73  rgument pStmt is
2ec80 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20   a prepared SQL 
2ec90 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
2eca0 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65  function compile
2ecb0 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20  s.** an EXPLAIN 
2ecc0 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
2ecd0 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20  nd to report on 
2ece0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
2ecf0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70  tement,.** and p
2ed00 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74  rints the report
2ed10 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67   to stdout using
2ed20 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e   printf()..*/.in
2ed30 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  t printExplainQu
2ed40 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f  eryPlan(sqlite3_
2ed50 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  stmt *pStmt){.  
2ed60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2ed70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ed80 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a  /* Input SQL */.
2ed90 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e    char *zExplain
2eda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2edb0 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58    /* SQL with EX
2edc0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2edd0 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20   prepended */.  
2ede0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
2edf0 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20  xplain;         
2ee00 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c  /* Compiled EXPL
2ee10 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
2ee20 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2ee30 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ee50 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2ee60 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2ee70 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20  v2() */..  zSql 
2ee80 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
2ee90 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  tmt);.  if( zSql
2eea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2eeb0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  ITE_ERROR;..  zE
2eec0 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
2eed0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
2eee0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
2eef0 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  , zSql);.  if( z
2ef00 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74  Explain==0 ) ret
2ef10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2ef20 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2ef30 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c  3_prepare_v2(sql
2ef40 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
2ef50 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c  Stmt), zExplain,
2ef60 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
2ef70 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
2ef80 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ee(zExplain);.  
2ef90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2efa0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
2efb0 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
2efc0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2efd0 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20  p(pExplain) ){. 
2efe0 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64     int iSelectid
2eff0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2f000 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
2f010 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64  0);.    int iOrd
2f020 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  er = sqlite3_col
2f030 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2f040 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46  , 1);.    int iF
2f050 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  rom = sqlite3_co
2f060 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2f070 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74  n, 2);.    const
2f080 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d   char *zDetail =
2f090 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2f0a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2f0b0 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
2f0c0 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64  ..    printf("%d
2f0d0 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53   %d %d %s\n", iS
2f0e0 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c  electid, iOrder,
2f0f0 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29   iFrom, zDetail)
2f100 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2f110 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2f120 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73  (pExplain);.}..s
2f130 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2f140 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 69  _TCLAPI test_pri
2f150 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a  nt_eqp(.  void *
2f160 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2f170 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f180 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2f190 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2f1a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2f1b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
2f1c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
2f1d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2f1e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2f1f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2f200 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
2f210 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
2f230 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
2f240 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2f250 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
2f260 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
2f270 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72  ERROR;.  rc = pr
2f280 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2f290 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  lan(pStmt);.  /*
2f2a0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
2f2b0 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68  on Windows so th
2f2c0 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20 75  at a test case u
2f2d0 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20  sing this .  ** 
2f2e0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65  function can ope
2f2f0 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61 6e  n a read pipe an
2f300 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  d get the output
2f310 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78   of.  ** printEx
2f320 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29  plainQueryPlan()
2f330 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2f340 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  */.  fflush(stdo
2f350 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ut);.  Tcl_SetRe
2f360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2f370 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2f380 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
2f390 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2f3a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2f3b0 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f  IT_EXPLAIN */../
2f3c0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73  *.** sqlite3_tes
2f3d0 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41  t_control VERB A
2f3e0 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  RGS....*/.static
2f3f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2f400 50 49 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e  PI test_test_con
2f410 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
2f420 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2f430 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2f440 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2f450 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2f460 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
2f470 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73   Verb {.    cons
2f480 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
2f490 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56     int i;.  } aV
2f4a0 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  erb[] = {.    { 
2f4b0 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2f4c0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2f4d0 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53  ",    SQLITE_TES
2f4e0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
2f4f0 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20  FAULT }, .    { 
2f500 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2f510 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20  _SORTER_MMAP",  
2f520 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
2f530 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
2f540 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20  P     }, .    { 
2f550 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2f560 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20 20 20  _IMPOSTER",     
2f570 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
2f580 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 20  TCTRL_IMPOSTER  
2f590 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2f5a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f5b0 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f  INTERNAL_FUNCTIO
2f5c0 4e 53 22 2c 20 53 51 4c 49 54 45 5f 54 45 53 54  NS", SQLITE_TEST
2f5d0 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55  CTRL_INTERNAL_FU
2f5e0 4e 43 54 49 4f 4e 53 7d 2c 0a 20 20 7d 3b 0a 20  NCTIONS},.  };. 
2f5f0 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e   int iVerb;.  in
2f600 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72  t iFlag;.  int r
2f610 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  c;..  if( objc<2
2f620 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2f630 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2f640 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20   1, objv, "VERB 
2f650 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  ARGS...");.    r
2f660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f670 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c  .  }..  rc = Tcl
2f680 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
2f690 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e  Struct(.      in
2f6a0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61  terp, objv[1], a
2f6b0 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65  Verb, sizeof(aVe
2f6c0 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20  rb[0]), "VERB", 
2f6d0 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20  0, &iVerb.  );. 
2f6e0 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
2f6f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
2f700 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56  iFlag = aVerb[iV
2f710 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68  erb].i;.  switch
2f720 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63  ( iFlag ){.    c
2f730 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
2f740 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e  TRL_INTERNAL_FUN
2f750 43 54 49 4f 4e 53 3a 0a 20 20 20 20 63 61 73 65  CTIONS:.    case
2f760 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2f770 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2f780 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61  : {.      int va
2f790 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  l;.      if( obj
2f7a0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
2f7b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2f7c0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
2f7d0 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20  , "ONOFF");.    
2f7e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f7f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
2f800 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
2f810 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2f820 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2f830 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
2f840 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73  L_ERROR;.      s
2f850 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2f860 72 6f 6c 28 69 46 6c 61 67 2c 20 76 61 6c 29 3b  rol(iFlag, val);
2f870 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2f880 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
2f890 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
2f8a0 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20  RTER_MMAP: {.   
2f8b0 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20     int val;.    
2f8c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2f8d0 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
2f8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2f8f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2f900 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44  erp, 2, objv, "D
2f910 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20  B LIMIT");.     
2f920 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f930 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2f940 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
2f950 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2f960 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2f970 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2f980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2f990 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
2f9a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
2f9b0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
2f9c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2f9d0 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
2f9e0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2f9f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
2fa00 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
2fa10 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  val);.      brea
2fa20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
2fa30 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
2fa40 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20  RL_IMPOSTER: {. 
2fa50 20 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20       int onOff, 
2fa60 74 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  tnum;.      cons
2fa70 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
2fa80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2fa90 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  db;.      if( ob
2faa0 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  jc!=6 ){.       
2fab0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2fac0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
2fad0 76 2c 20 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e  v, "DB dbName on
2fae0 4f 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20  Off tnum");.    
2faf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2fb00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
2fb10 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
2fb20 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2fb30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2fb40 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  2]), &db) ) retu
2fb50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2fb60 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
2fb70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2fb80 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [3]);.      if( 
2fb90 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2fba0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
2fbb0 5d 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72 65 74  ], &onOff) ) ret
2fbc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2fbd0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
2fbe0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2fbf0 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75  p, objv[5], &tnu
2fc00 6d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  m) ) return TCL_
2fc10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
2fc20 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2fc30 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2fc40 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
2fc50 7a 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20  zDbName, onOff, 
2fc60 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  tnum);.      bre
2fc70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2fc80 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2fc90 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
2fca0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
2fcb0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
2fcc0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
2fcd0 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
2fce0 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
2fcf0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
2fd00 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2fd10 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69  getrusage(.  voi
2fd20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2fd30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2fd40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2fd50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2fd60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
2fd70 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20  har buf[1024];. 
2fd80 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 72   struct rusage r
2fd90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30  ;.  memset(&r, 0
2fda0 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  , sizeof(r));.  
2fdb0 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
2fdc0 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73  _SELF, &r);..  s
2fdd0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fde0 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62 75 66  sizeof(buf), buf
2fdf0 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d 65 3d  ,.    "ru_utime=
2fe00 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d 65  %d.%06d ru_stime
2fe10 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66  =%d.%06d ru_minf
2fe20 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d  lt=%d ru_majflt=
2fe30 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29 72  %d", .    (int)r
2fe40 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63  .ru_utime.tv_sec
2fe50 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d  , (int)r.ru_utim
2fe60 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20  e.tv_usec, .    
2fe70 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e  (int)r.ru_stime.
2fe80 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72  tv_sec, (int)r.r
2fe90 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c  u_stime.tv_usec,
2fea0 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
2feb0 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72  minflt, (int)r.r
2fec0 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20  u_majflt.  );.  
2fed0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2fee0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2fef0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d  StringObj(buf, -
2ff00 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
2ff10 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
2ff20 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2ff30 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  N./*.** Informat
2ff40 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d 20  ion passed from 
2ff50 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20  the main thread 
2ff60 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 73  into the windows
2ff70 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20   file locker.** 
2ff80 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
2ff90 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  d..*/.struct win
2ffa0 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20  32FileLocker {. 
2ffb0 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20   char *evName;  
2ffc0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2ffd0 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20  event to signal 
2ffe0 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20 2a  thread startup *
2fff0 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
30000 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
30010 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
30020 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
30030 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20 20  int delay1;     
30040 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66      /* Delay bef
30050 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ore locking */. 
30060 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20 20   int delay2;    
30070 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
30080 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a  fore unlocking *
30090 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20  /.  int ok;     
300a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
300b0 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20  hed ok */.  int 
300c0 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  err;            
300d0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
300e0 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b  ror occurs */.};
300f0 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51  .#endif...#if SQ
30100 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63  LITE_OS_WIN.#inc
30110 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e  lude <process.h>
30120 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67  ./*.** The backg
30130 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61  round thread tha
30140 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b  t does file lock
30150 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
30160 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c  oid SQLITE_CDECL
30170 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
30180 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  er(void *pAppDat
30190 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  a){.  struct win
301a0 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20  32FileLocker *p 
301b0 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33 32 46  = (struct win32F
301c0 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44  ileLocker*)pAppD
301d0 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76  ata;.  if( p->ev
301e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e 44  Name ){.    HAND
301f0 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e  LE ev = OpenEven
30200 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53  t(EVENT_MODIFY_S
30210 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e  TATE, FALSE, p->
30220 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20  evName);.    if 
30230 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20 53 65  ( ev ){.      Se
30240 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20 20 20  tEvent(ev);.    
30250 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
30260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
30270 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29 20 53  f( p->delay1 ) S
30280 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b  leep(p->delay1);
30290 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28  .  if( LockFile(
302a0 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30  p->h, 0, 0, 1000
302b0 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20 20 20  00000, 0) ){.   
302c0 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 32   Sleep(p->delay2
302d0 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  );.    UnlockFil
302e0 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
302f0 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20 20 20  0000000, 0);.   
30300 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65   p->ok = 1;.  }e
30310 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20  lse{.    p->err 
30320 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65  = 1;.  }.  Close
30330 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20  Handle(p->h);.  
30340 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64  p->h = 0;.  p->d
30350 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e  elay1 = 0;.  p->
30360 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65  delay2 = 0;.}.#e
30370 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
30380 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20  _OS_WIN./*.**   
30390 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69     lock_win32_fi
303a0 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41  le FILENAME DELA
303b0 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20  Y1 DELAY2.**.** 
303c0 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
303d0 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20   manditory lock 
303e0 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45 4c 41  on file for DELA
303f0 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  Y2 milliseconds.
30400 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59 31 20  .** Wait DELAY1 
30410 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
30420 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 74 68  ore acquiring th
30430 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
30440 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
30450 41 50 49 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  API win32_file_l
30460 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
30470 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
30480 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
30490 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
304a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
304b0 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  v[].){.  static 
304c0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
304d0 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69  Locker x = { "wi
304e0 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20  n32_file_lock", 
304f0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  0, 0, 0, 0, 0 };
30500 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30510 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72  Filename;.  char
30520 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e   zBuf[200];.  in
30530 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48  t retry = 0;.  H
30540 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52  ANDLE ev;.  DWOR
30550 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20  D wResult;.  .  
30560 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
30570 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
30580 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
30590 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
305a0 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31  "FILENAME DELAY1
305b0 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72   DELAY2");.    r
305c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
305d0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
305e0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
305f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30600 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
30610 25 64 20 25 64 20 25 64 20 25 64 20 25 64 22 2c  %d %d %d %d %d",
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30630 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72        x.ok, x.er
30640 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64  r, x.delay1, x.d
30650 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20  elay2, x.h);.   
30660 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
30670 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
30680 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
30690 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
306a0 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26  }.  while( x.h &
306b0 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20  & retry<30 ){.  
306c0 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53    retry++;.    S
306d0 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20  leep(100);.  }. 
306e0 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20   if( x.h ){.    
306f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
30700 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c  (interp, "busy",
30710 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
30720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
30740 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
30750 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
30760 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74 75  x.delay1) ) retu
30770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30780 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
30790 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
307a0 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32  jv[3], &x.delay2
307b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
307c0 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  RROR;.  zFilenam
307d0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
307e0 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e  g(objv[1]);.  x.
307f0 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a  h = CreateFile(z
30800 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49  Filename, GENERI
30810 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57  C_READ|GENERIC_W
30820 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  RITE,.          
30830 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52      FILE_SHARE_R
30840 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57  EAD|FILE_SHARE_W
30850 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c  RITE, 0, OPEN_AL
30860 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20  WAYS,.          
30870 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
30880 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20  TE_NORMAL, 0);. 
30890 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20   if( !x.h ){.   
308a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
308b0 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
308c0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
308d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72  zFilename, (char
308e0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
308f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30900 20 20 65 76 20 3d 20 43 72 65 61 74 65 45 76 65    ev = CreateEve
30910 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46  nt(NULL, TRUE, F
30920 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b  ALSE, x.evName);
30930 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20  .  if ( !ev ){. 
30940 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
30950 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
30960 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e 74  not create event
30970 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28  : ", x.evName, (
30980 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
30990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
309a0 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65    }.  _beginthre
309b0 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  ad(win32_file_lo
309c0 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29  cker, 0, (void*)
309d0 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b  &x);.  Sleep(0);
309e0 0a 20 20 69 66 20 28 20 28 77 52 65 73 75 6c 74  .  if ( (wResult
309f0 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   = WaitForSingle
30a00 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30  Object(ev, 10000
30a10 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f  ))!=WAIT_OBJECT_
30a20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30a30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30a40 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30  (zBuf), zBuf, "0
30a50 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a  x%x", wResult);.
30a60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
30a70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61  sult(interp, "wa
30a80 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42  it failed: ", zB
30a90 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
30aa0 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65     CloseHandle(e
30ab0 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  v);.    return T
30ac0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30ad0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
30ae0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
30af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
30b00 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74  exists_win32_pat
30b10 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74  h PATH.**.** Ret
30b20 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
30b30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
30b40 61 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f 73  ath exists, whos
30b50 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
30b60 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78  d name.** may ex
30b70 63 65 65 64 20 32 36 30 20 63 68 61 72 61 63 74  ceed 260 charact
30b80 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
30b90 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
30ba0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
30bb0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
30bc0 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68  in32_exists_path
30bd0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
30be0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
30bf0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
30c00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
30c10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
30c20 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
30c30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
30c40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
30c50 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22   1, objv, "PATH"
30c60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30c70 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
30c80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
30c90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
30ca0 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20  ooleanObj(.     
30cb0 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
30cc0 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69 63  esW( Tcl_GetUnic
30cd0 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49  ode(objv[1]))!=I
30ce0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
30cf0 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65 74  IBUTES ));.  ret
30d00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
30d10 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f 77  *.**      find_w
30d20 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45 52  in32_file PATTER
30d30 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  N.**.** Returns 
30d40 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69 65  a list of entrie
30d50 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79  s in a directory
30d60 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
30d70 73 70 65 63 69 66 69 65 64 20 70 61 74 74 65 72  specified patter
30d80 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c  n,.** whose full
30d90 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
30da0 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 20   may exceed 248 
30db0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
30dc0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
30dd0 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  h.** "\\?\"..*/.
30de0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
30df0 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 66  E_TCLAPI win32_f
30e00 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64  ind_file(.  void
30e10 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
30e20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
30e30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
30e40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
30e50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e   objv[].){.  HAN
30e60 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d 20  DLE hFindFile = 
30e70 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
30e80 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49  ALUE;.  WIN32_FI
30e90 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61 74  ND_DATAW findDat
30ea0 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  a;.  Tcl_Obj *li
30eb0 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c  stObj;.  DWORD l
30ec0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  astErrno;.  if( 
30ed0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
30ee0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
30ef0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
30f00 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20 20   "PATTERN");.   
30f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30f20 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46 69  R;.  }.  hFindFi
30f30 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69  le = FindFirstFi
30f40 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  leW(Tcl_GetUnico
30f50 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69  de(objv[1]), &fi
30f60 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20 68  ndData);.  if( h
30f70 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49  FindFile==INVALI
30f80 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
30f90 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
30fa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
30fb0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
30fc0 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
30fd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30fe0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c  L_ERROR;.  }.  l
30ff0 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  istObj = Tcl_New
31000 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Obj();.  Tcl_Inc
31010 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62  rRefCount(listOb
31020 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54  j);.  do {.    T
31030 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
31040 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
31050 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  listObj, Tcl_New
31060 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20  UnicodeObj(.    
31070 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46 69      findData.cFi
31080 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  leName, -1));.  
31090 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
310a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
310b0 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f  p, listObj, Tcl_
310c0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20  NewWideIntObj(. 
310d0 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e         findData.
310e0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
310f0 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 46  ));.  } while( F
31100 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46 69  indNextFileW(hFi
31110 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61 74  ndFile, &findDat
31120 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e  a) );.  lastErrn
31130 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
31140 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45 72  ();.  if( lastEr
31150 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26  rno!=NO_ERROR &&
31160 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
31170 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20  R_NO_MORE_FILES 
31180 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73 65  ){.    FindClose
31190 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20  (hFindFile);.   
311a0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
311b0 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20  t(listObj);.    
311c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
311d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
311e0 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
311f0 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
31200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31210 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f  R;.  }.  FindClo
31220 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20  se(hFindFile);. 
31230 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
31240 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
31250 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  j);.  return TCL
31260 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
31270 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f     delete_win32_
31280 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  file FILENAME.**
31290 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65 20  .** Deletes the 
312a0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
312b0 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
312c0 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65  ified name may e
312d0 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68 61  xceed 260.** cha
312e0 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
312f0 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
31300 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
31310 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
31320 50 49 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f  PI win32_delete_
31330 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c  file(.  void *cl
31340 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
31350 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
31360 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
31370 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
31380 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
31390 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
313a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
313b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
313c0 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72  ILENAME");.    r
313d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
313e0 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c 65  .  }.  if( !Dele
313f0 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55  teFileW(Tcl_GetU
31400 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29  nicode(objv[1]))
31410 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
31420 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
31430 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
31440 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
31450 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
31460 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
31470 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
31480 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
31490 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
314a0 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77 69  .**      make_wi
314b0 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52  n32_dir DIRECTOR
314c0 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20  Y.**.** Creates 
314d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69  the specified di
314e0 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66  rectory, whose f
314f0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
31500 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32  ame may exceed 2
31510 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  48.** characters
31520 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
31530 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
31540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
31550 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33  LITE_TCLAPI win3
31560 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64 20  2_mkdir(.  void 
31570 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
31580 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
31590 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
315a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
315b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
315c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
315d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
315e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
315f0 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20   "DIRECTORY");. 
31600 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
31610 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ROR;.  }.  if( !
31620 43 72 65 61 74 65 44 69 72 65 63 74 6f 72 79 57  CreateDirectoryW
31630 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28  (Tcl_GetUnicode(
31640 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20  objv[1]), NULL) 
31650 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
31660 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
31670 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
31680 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
31690 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
316a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
316b0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
316c0 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
316d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
316e0 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65 5f 77  **      remove_w
316f0 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f  in32_dir DIRECTO
31700 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73  RY.**.** Removes
31710 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
31720 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20  irectory, whose 
31730 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
31740 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
31750 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  248.** character
31760 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
31770 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
31780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
31790 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e  QLITE_TCLAPI win
317a0 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64  32_rmdir(.  void
317b0 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
317c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
317d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
317e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
317f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
31800 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
31810 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
31820 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
31830 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
31840 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
31850 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
31860 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79  !RemoveDirectory
31870 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
31880 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20  (objv[1])) ){.  
31890 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
318a0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
318b0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
318c0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
318d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
318e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52  ROR;.  }.  Tcl_R
318f0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
31900 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
31910 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
31920 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d  /*.**      optim
31930 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20  ization_control 
31940 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a  DB OPT BOOLEAN.*
31950 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
31960 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74  isable query opt
31970 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67  imizations using
31980 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
31990 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69  t_control().** i
319a0 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61 62  nterface.  Disab
319b0 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
319c0 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c   false and enabl
319d0 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  e if BOOLEAN is 
319e0 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20  true..** OPT is 
319f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
31a00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
31a10 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a  be disabled..*/.
31a20 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
31a30 45 5f 54 43 4c 41 50 49 20 6f 70 74 69 6d 69 7a  E_TCLAPI optimiz
31a40 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20  ation_control(. 
31a50 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
31a60 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
31a70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
31a80 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
31a90 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
31aa0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
31ab0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
31ac0 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69   char *zOpt;.  i
31ad0 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20  nt onoff;.  int 
31ae0 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74  mask = 0;.  stat
31af0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
31b00 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
31b10 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20   *zOptName;.    
31b20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f  int mask;.  } aO
31b30 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  pt[] = {.    { "
31b40 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  all",           
31b50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c        SQLITE_All
31b60 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c 0a 20  Opts        },. 
31b70 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20     { "none",    
31b80 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ba0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65 72    },.    { "quer
31bb0 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20 20 20  y-flattener",   
31bc0 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c    SQLITE_QueryFl
31bd0 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b  attener },.    {
31be0 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22   "groupby-order"
31bf0 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 47  ,       SQLITE_G
31c00 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c  roupByOrder   },
31c10 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63  .    { "factor-c
31c20 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53 51  onstants",    SQ
31c30 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
31c40 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69  nst },.    { "di
31c50 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20  stinct-opt",    
31c60 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69      SQLITE_Disti
31c70 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20  nctOpt    },.   
31c80 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63   { "cover-idx-sc
31c90 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  an",      SQLITE
31ca0 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20  _CoverIdxScan   
31cb0 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d  },.    { "order-
31cc0 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20  by-idx-join",   
31cd0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
31ce0 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22  xJoin },.    { "
31cf0 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20  transitive",    
31d00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61        SQLITE_Tra
31d10 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20  nsitive     },. 
31d20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d     { "omit-noop-
31d30 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51 4c 49  join",      SQLI
31d40 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20  TE_OmitNoopJoin 
31d50 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74    },.    { "stat
31d60 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
31d70 20 20 53 51 4c 49 54 45 5f 53 74 61 74 34 20 20    SQLITE_Stat4  
31d80 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
31d90 20 22 73 6b 69 70 2d 73 63 61 6e 22 2c 20 20 20   "skip-scan",   
31da0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
31db0 6b 69 70 53 63 61 6e 20 20 20 20 20 20 20 7d 2c  kipScan       },
31dc0 0a 20 20 20 20 7b 20 22 70 75 73 68 2d 64 6f 77  .    { "push-dow
31dd0 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  n",           SQ
31de0 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 20 20 20  LITE_PushDown   
31df0 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69      },.  };..  i
31e00 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
31e10 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
31e20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
31e30 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c  jv, "DB OPT BOOL
31e40 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
31e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
31e60 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
31e70 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
31e80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
31e90 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
31ea0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
31eb0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
31ec0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
31ed0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66   objv[3], &onoff
31ee0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
31ef0 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54  RROR;.  zOpt = T
31f00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
31f10 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
31f20 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
31f30 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
31f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
31f50 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70  strcmp(zOpt, aOp
31f60 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d  t[i].zOptName)==
31f70 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  0 ){.      mask 
31f80 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a  = aOpt[i].mask;.
31f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31fa0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f   }.  }.  if( ono
31fb0 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73  ff ) mask = ~mas
31fc0 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65  k;.  if( i>=size
31fd0 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
31fe0 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20  aOpt[0]) ){.    
31ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
32000 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
32010 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
32020 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
32030 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  f:",.           
32040 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
32050 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  )0);.    for(i=0
32060 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29  ; i<sizeof(aOpt)
32070 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
32080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
32090 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
320a0 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74  nterp, " ", aOpt
320b0 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63  [i].zOptName, (c
320c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20  har*)0);.    }. 
320d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
320e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
320f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
32100 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
32110 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64  OPTIMIZATIONS, d
32120 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75  b, mask);.  retu
32130 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
32140 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74 61  .**     load_sta
32150 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  tic_extension DB
32160 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   NAME ....**.** 
32170 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  Load one or more
32180 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
32190 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  ed extensions..*
321a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
321b0 49 54 45 5f 54 43 4c 41 50 49 20 74 63 6c 4c 6f  ITE_TCLAPI tclLo
321c0 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
321d0 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  nCmd(.  void * c
321e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
321f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
32200 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
32210 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
32220 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e  jv[].){.  extern
32230 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d 61   int sqlite3_ama
32240 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  tch_init(sqlite3
32250 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
32260 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
32270 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
32280 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 61 72 72  int sqlite3_carr
32290 61 79 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ay_init(sqlite3*
322a0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
322b0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
322c0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
322d0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75  nt sqlite3_closu
322e0 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  re_init(sqlite3*
322f0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
32300 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
32310 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
32320 6e 74 20 73 71 6c 69 74 65 33 5f 63 73 76 5f 69  nt sqlite3_csv_i
32330 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
32340 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
32350 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
32360 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
32370 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74  qlite3_eval_init
32380 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
32390 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
323a0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
323b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
323c0 74 65 33 5f 65 78 70 6c 61 69 6e 5f 69 6e 69 74  te3_explain_init
323d0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
323e0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
323f0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
32400 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
32410 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
32420 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
32430 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
32440 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
32450 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
32460 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73  e3_fuzzer_init(s
32470 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
32480 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
32490 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
324a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
324b0 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c 69  3_ieee_init(sqli
324c0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
324d0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
324e0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
324f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e  rn int sqlite3_n
32500 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71 6c  extchar_init(sql
32510 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
32520 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
32530 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
32540 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32550 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28  percentile_init(
32560 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
32570 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
32580 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 69  i_routines*);.#i
32590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
325a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
325b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
325c0 74 65 33 5f 70 72 65 66 69 78 65 73 5f 69 6e 69  te3_prefixes_ini
325d0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
325e0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
325f0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
32600 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20  #endif.  extern 
32610 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67 65  int sqlite3_rege
32620 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  xp_init(sqlite3*
32630 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
32640 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
32650 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
32660 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6d 65 6d  nt sqlite3_remem
32670 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ber_init(sqlite3
32680 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
32690 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
326a0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
326b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 72 69  int sqlite3_seri
326c0 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  es_init(sqlite3*
326d0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
326e0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
326f0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
32700 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c  nt sqlite3_spell
32710 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  fix_init(sqlite3
32720 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
32730 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
32740 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
32750 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 79  int sqlite3_toty
32760 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  pe_init(sqlite3*
32770 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
32780 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
32790 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
327a0 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65  nt sqlite3_whole
327b0 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69  number_init(sqli
327c0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
327d0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
327e0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
327f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 75  rn int sqlite3_u
32800 6e 69 6f 6e 76 74 61 62 5f 69 6e 69 74 28 73 71  nionvtab_init(sq
32810 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
32820 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
32830 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 69 66 64  routines*);.#ifd
32840 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
32850 4c 49 42 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  LIB.  extern int
32860 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65   sqlite3_zipfile
32870 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
32880 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
32890 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
328a0 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 61  *);.#endif.  sta
328b0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
328c0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
328d0 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20  r *zExtName;.   
328e0 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71   int (*pInit)(sq
328f0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
32900 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
32910 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20  routines*);.  } 
32920 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b  aExtension[] = {
32930 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c  .    { "amatch",
32940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32950 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
32960 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
32970 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61 72 72    },.    { "carr
32980 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ay",            
32990 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61 72 72      sqlite3_carr
329a0 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ay_init         
329b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
329c0 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20 20  closure",       
329d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
329e0 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20 20  closure_init    
329f0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32a00 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20 20 20   { "csv",       
32a10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32a20 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20 20 20  te3_csv_init    
32a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32a40 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20 20  .    { "eval",  
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69  sqlite3_eval_ini
32a70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
32a80 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 70 6c    },.    { "expl
32a90 61 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ain",           
32aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 6c      sqlite3_expl
32ab0 61 69 6e 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ain_init        
32ac0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
32ad0 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20 20  fileio",        
32ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32af0 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20 20  fileio_init     
32b00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32b10 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20 20   { "fuzzer",    
32b20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32b30 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20  te3_fuzzer_init 
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32b50 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34 22  .    { "ieee754"
32b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32b70 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69  sqlite3_ieee_ini
32b80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
32b90 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74    },.    { "next
32ba0 63 68 61 72 22 2c 20 20 20 20 20 20 20 20 20 20  char",          
32bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74      sqlite3_next
32bc0 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20 20  char_init       
32bd0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
32be0 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20 20  percentile",    
32bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32c00 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20  percentile_init 
32c10 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
32c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32c30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
32c40 20 20 7b 20 22 70 72 65 66 69 78 65 73 22 2c 20    { "prefixes", 
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32c60 69 74 65 33 5f 70 72 65 66 69 78 65 73 5f 69 6e  ite3_prefixes_in
32c70 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
32c80 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22  ,.#endif.    { "
32c90 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20 20  regexp",        
32ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32cb0 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20 20  regexp_init     
32cc0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32cd0 20 7b 20 22 72 65 6d 65 6d 62 65 72 22 2c 20 20   { "remember",  
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32cf0 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69 6e 69  te3_remember_ini
32d00 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t             },
32d10 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73 22 2c  .    { "series",
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d30 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69  sqlite3_series_i
32d40 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
32d50 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c    },.    { "spel
32d60 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  lfix",          
32d70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c      sqlite3_spel
32d80 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20  lfix_init       
32d90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
32da0 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  totype",        
32db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32dc0 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20  totype_init     
32dd0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
32de0 20 7b 20 22 75 6e 69 6f 6e 76 74 61 62 22 2c 20   { "unionvtab", 
32df0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32e00 74 65 33 5f 75 6e 69 6f 6e 76 74 61 62 5f 69 6e  te3_unionvtab_in
32e10 69 74 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  it            },
32e20 0a 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d  .    { "wholenum
32e30 62 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ber",           
32e40 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d  sqlite3_wholenum
32e50 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ber_init        
32e60 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49    },.#ifdef SQLI
32e70 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20  TE_HAVE_ZLIB.   
32e80 20 7b 20 22 7a 69 70 66 69 6c 65 22 2c 20 20 20   { "zipfile",   
32e90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32ea0 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74  te3_zipfile_init
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32ec0 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73  .#endif.  };.  s
32ed0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
32ee0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
32ef0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63 3b  .  int i, j, rc;
32f00 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
32f10 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
32f20 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <3 ){.    Tcl_Wr
32f30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
32f40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
32f50 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  NAME ...");.    
32f60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32f70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
32f80 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
32f90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
32fa0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
32fb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32fc0 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a 3c 6f  ;.  for(j=2; j<o
32fd0 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  bjc; j++){.    z
32fe0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
32ff0 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b 0a 20  ring(objv[j]);. 
33000 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
33010 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69  raySize(aExtensi
33020 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  on); i++){.     
33030 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
33040 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d  e, aExtension[i]
33050 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20 29 20  .zExtName)==0 ) 
33060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
33070 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
33080 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20 29 7b  e(aExtension) ){
33090 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
330a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
330b0 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e 73 69  "no such extensi
330c0 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 28 63  on: ", zName, (c
330d0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
330e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
330f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
33100 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e  Extension[i].pIn
33110 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
33120 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
33130 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
33140 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
33150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
33160 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
33170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33180 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29  _OK || zErrMsg )
33190 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
331a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
331b0 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e   "initialization
331c0 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22 20   of ", zName, " 
331d0 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72 4d  failed: ", zErrM
331e0 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
331f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
33200 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
33210 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
33220 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
33230 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
33240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
33250 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
33260 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66     sorter_test_f
33270 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a 2a 0a  akeheap BOOL.**.
33280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
33290 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f 72 74  LITE_TCLAPI sort
332a0 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
332b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
332c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
332d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
332e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
332f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
33300 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67 3b 0a  .){.  int bArg;.
33310 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
33320 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
33330 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
33340 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b 0a   objv, "BOOL");.
33350 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
33360 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
33370 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
33380 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
33390 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29 20 29  bjv[1], &bArg) )
333a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
333b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
333c0 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20 20 69  f( bArg ){.    i
333d0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
333e0 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
333f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33400 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
33410 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ap = SQLITE_INT_
33420 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20 20 20  TO_PTR(-1);.    
33430 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
33440 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
33450 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 53 51  Config.pHeap==SQ
33460 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
33470 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  -1) ){.      sql
33480 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
33490 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20 20 20  .pHeap = 0;.    
334a0 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73  }.  }..  Tcl_Res
334b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
334c0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
334d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
334e0 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74  sorter_test_sort
334f0 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51 4c 31  4_helper DB SQL1
33500 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a 0a 2a   NSTEP SQL2.**.*
33510 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20 73 74  * Compile SQL st
33520 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20 61 6e  atement $SQL1 an
33530 64 20 73 74 65 70 20 69 74 20 24 4e 53 54 45 50  d step it $NSTEP
33540 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61 63 68   times. For each
33550 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63 6b 20   row, .** check 
33560 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d 6f 73  that the leftmos
33570 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73 74 20  t and rightmost 
33580 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
33590 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65 67 65   are both intege
335a0 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20  rs,.** and that 
335b0 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74 68 65  both contain the
335c0 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   same value..**.
335d0 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74 65 20  ** Then execute 
335e0 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 32 2e  statement $SQL2.
335f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
33600 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
33610 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 65  s the same.** se
33620 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  t of integers in
33630 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20   the same order 
33640 61 73 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  as in the previo
33650 75 73 20 73 74 65 70 20 28 75 73 69 6e 67 20 24  us step (using $
33660 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  SQL1)..*/.static
33670 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
33680 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73  PI sorter_test_s
33690 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20 20 76  ort4_helper(.  v
336a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
336b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
336c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
336d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
336e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
336f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
33700 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l1;.  const char
33710 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74 20 6e   *zSql2;.  int n
33720 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 53 74  Step; .  int iSt
33730 65 70 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64 20  ep; .  unsigned 
33740 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b  int iCksum1 = 0;
33750 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   .  unsigned int
33760 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20 0a 20   iCksum2 = 0; . 
33770 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
33780 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  B;.  sqlite3 *db
33790 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
337a0 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20 69 66   *pStmt;.  .  if
337b0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
337c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
337d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
337e0 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53 54 45  v, "DB SQL1 NSTE
337f0 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20 72 65  P SQL2");.    re
33800 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
33810 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
33820 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
33830 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
33840 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
33850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
33860 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c 5f 47  .  zSql1 = Tcl_G
33870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
33880 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
33890 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
338a0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 74  p, objv[3], &nSt
338b0 65 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ep) ) return TCL
338c0 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 32 20  _ERROR;.  zSql2 
338d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
338e0 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72 63 20  objv[4]);..  rc 
338f0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
33900 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31 2c 20  e_v2(db, zSql1, 
33910 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
33920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33930 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65  _OK ) goto sql_e
33940 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20 73 71  rror;..  iB = sq
33950 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
33960 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20 20 66  nt(pStmt)-1;.  f
33970 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53 74 65  or(iStep=0; iSte
33980 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c 49 54  p<nStep && SQLIT
33990 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
339a0 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65  tep(pStmt); iSte
339b0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  p++){.    int a 
339c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
339d0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
339e0 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c 69 74      if( a!=sqlit
339f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
33a00 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20 20 20  tmt, iB) ){.    
33a10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
33a20 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61 74 61  lt(interp, "data
33a30 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29 22 2c   error: (a!=b)",
33a40 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
33a50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
33a60 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d 31 20   }..    iCksum1 
33a70 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c 20 33  += (iCksum1 << 3
33a80 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  ) + (unsigned in
33a90 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  t)a;.  }.  rc = 
33aa0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
33ab0 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
33ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
33ad0 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a  oto sql_error;..
33ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
33af0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
33b00 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ql2, -1, &pStmt,
33b10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
33b20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33b30 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66 6f 72  sql_error;.  for
33b40 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49 54 45  (iStep=0; SQLITE
33b50 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
33b60 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70  ep(pStmt); iStep
33b70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  ++){.    int a =
33b80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
33b90 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
33ba0 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20 28 69     iCksum2 += (i
33bb0 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b 20 28  Cksum2 << 3) + (
33bc0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a  unsigned int)a;.
33bd0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
33be0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
33bf0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
33c00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
33c10 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ql_error;..  if(
33c20 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73 75 6d   iCksum1!=iCksum
33c30 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
33c40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
33c50 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69 73 6d  , "checksum mism
33c60 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20 20 72  atch", 0);.    r
33c70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
33c80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
33c90 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72 6f  CL_OK;. sql_erro
33ca0 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  r:.  Tcl_AppendR
33cb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73  esult(interp, "s
33cc0 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73 71 6c  ql error: ", sql
33cd0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
33ce0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
33cf0 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69 66  L_ERROR;.}...#if
33d00 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
33d10 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 23  AUTHENTICATION.#
33d20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
33d30 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a 0a 2a  userauth.h"./*.*
33d40 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
33d50 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
33d60 63 61 74 65 20 44 42 20 55 53 45 52 4e 41 4d 45  cate DB USERNAME
33d70 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73 74 61   PASSWORD.*/.sta
33d80 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
33d90 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65 72 5f  CLAPI test_user_
33da0 61 75 74 68 65 6e 74 69 63 61 74 65 28 0a 20 20  authenticate(.  
33db0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
33dc0 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
33dd0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
33de0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
33df0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
33e00 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
33e10 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
33e20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
33e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33e40 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
33e50 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
33e60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
33e70 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
33e80 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
33e90 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  zUser = 0;.  cha
33ea0 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a  r *zPasswd = 0;.
33eb0 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20    int nPasswd = 
33ec0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
33ed0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
33ee0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
33ef0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
33f00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
33f10 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45  jv, "DB USERNAME
33f20 20 50 41 53 53 57 4f 52 44 22 29 3b 0a 20 20 20   PASSWORD");.   
33f30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
33f40 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
33f50 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
33f60 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
33f70 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
33f80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
33f90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
33fa0 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
33fb0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
33fc0 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
33fd0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
33fe0 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
33ff0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
34000 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  3_user_authentic
34010 61 74 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  ate(db, zUser, z
34020 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 29  Passwd, nPasswd)
34030 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
34040 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
34050 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
34060 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
34070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
34080 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
34090 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
340a0 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64  ICATION */..#ifd
340b0 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  ef SQLITE_USER_A
340c0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
340d0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
340e0 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20 44 42  ite3_user_add DB
340f0 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
34100 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74  RD ISADMIN.*/.st
34110 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
34120 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65 72  TCLAPI test_user
34130 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _add(.  ClientDa
34140 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
34150 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
34160 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
34170 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
34180 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
34190 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
341a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
341b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
341c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
341d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
341e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
341f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
34200 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
34210 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
34220 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  0;.  char *zPass
34230 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  wd = 0;.  int nP
34240 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
34250 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20   isAdmin = 0;.  
34260 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
34270 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
34280 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
34290 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
342a0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
342b0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
342c0 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a  WORD ISADMIN");.
342d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
342e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
342f0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
34300 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
34310 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
34320 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
34330 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
34340 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
34350 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
34360 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
34370 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
34380 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
34390 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42  swd);.  Tcl_GetB
343a0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
343b0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
343c0 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d  isAdmin);.  rc =
343d0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64   sqlite3_user_ad
343e0 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  d(db, zUser, zPa
343f0 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
34400 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
34410 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
34420 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
34430 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
34440 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
34450 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
34460 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
34470 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
34480 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
34490 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
344a0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
344b0 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
344c0 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e  _change DB USERN
344d0 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
344e0 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  DMIN.*/.static i
344f0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
34500 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
34510 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
34520 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
34530 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
34540 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
34550 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
34560 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
34570 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
34580 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
34590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
345a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
345b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
345c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
345d0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
345e0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
345f0 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
34600 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20    char *zPasswd 
34610 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73  = 0;.  int nPass
34620 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  wd = 0;.  int is
34630 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  Admin = 0;.  sql
34640 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
34650 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
34660 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
34670 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
34680 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
34690 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
346a0 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20  D ISADMIN");.   
346b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
346c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
346d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
346e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
346f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
34700 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
34710 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
34720 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
34730 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
34740 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65  zPasswd = Tcl_Ge
34750 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
34760 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64  bjv[3], &nPasswd
34770 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  );.  Tcl_GetBool
34780 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
34790 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41  p, objv[4], &isA
347a0 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71  dmin);.  rc = sq
347b0 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
347c0 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  e(db, zUser, zPa
347d0 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
347e0 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
347f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
34800 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
34810 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
34820 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
34830 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
34840 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
34850 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
34860 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
34870 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
34880 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
34890 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
348a0 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e  _delete DB USERN
348b0 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
348c0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
348d0 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65  test_user_delete
348e0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
348f0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
34900 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
34910 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
34920 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
34930 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
34940 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
34950 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34970 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
34980 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
34990 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
349a0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
349b0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
349c0 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20  ar *zUser = 0;. 
349d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
349e0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
349f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
34a00 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
34a10 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
34a20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29 3b 0a  "DB USERNAME");.
34a30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
34a40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
34a50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
34a60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
34a70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
34a80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
34a90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
34aa0 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
34ab0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
34ac0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
34ad0 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62 2c 20  user_delete(db, 
34ae0 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f 53 65  zUser);.  Tcl_Se
34af0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
34b00 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
34b10 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
34b20 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
34b30 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
34b40 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
34b50 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
34b60 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
34b70 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54 59 50  bad_behavior TYP
34b80 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d 65 20  E.**.** Do some 
34b90 74 68 69 6e 67 73 20 74 68 61 74 20 73 68 6f 75  things that shou
34ba0 6c 64 20 74 72 69 67 67 65 72 20 61 20 76 61 6c  ld trigger a val
34bb0 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e 69 74  grind or -fsanit
34bc0 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a 2a 2a  ize=undefined.**
34bd0 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69 73 20   warning.  This 
34be0 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
34bf0 79 20 74 68 61 74 20 65 72 72 6f 72 73 20 61 6e  y that errors an
34c00 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74 70 75  d warnings outpu
34c10 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20 74 6f  t by those.** to
34c20 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ols are detected
34c30 20 62 79 20 74 68 65 20 74 65 73 74 20 73 63 72   by the test scr
34c40 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ipts..**.**     
34c50 20 20 54 59 50 45 20 20 20 20 20 20 20 42 45 48    TYPE       BEH
34c60 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20 20 31  AVIOR.**       1
34c70 20 20 20 20 20 20 20 20 20 20 4f 76 65 72 66 6c            Overfl
34c80 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e 74 65  ow a signed inte
34c90 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32 20 20  ger.**       2  
34ca0 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62 61 73          Jump bas
34cb0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
34cc0 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c 65 0a  alized variable.
34cd0 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20 20 20  **       3      
34ce0 20 20 20 20 52 65 61 64 20 61 66 74 65 72 20 66      Read after f
34cf0 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34 20 20  ree.**       4  
34d00 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a 2a 2f          Panic.*/
34d10 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
34d20 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
34d30 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20 20 43  ad_behavior(.  C
34d40 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
34d50 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
34d60 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63   to an integer c
34d70 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 2a  ontaining zero *
34d80 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
34d90 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
34da0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
34db0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
34dc0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
34dd0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
34de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34df0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
34e00 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
34e10 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
34e20 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
34e30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54 79 70  */.){.  int iTyp
34e40 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a 20 20  e;.  int xyz;.  
34e50 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a 29 63  int i = *(int*)c
34e60 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e 74  lientData;.  int
34e70 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30 5d 3b   j;.  int w[10];
34e80 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69 66 28  .  int *a;.  if(
34e90 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
34ea0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
34eb0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
34ec0 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20 20 72  , "TYPE");.    r
34ed0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
34ee0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
34ef0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
34f00 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69  erp, objv[1], &i
34f10 54 79 70 65 29 20 29 20 72 65 74 75 72 6e 20 54  Type) ) return T
34f20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77 69 74  CL_ERROR;.  swit
34f30 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20 20  ch( iType ){.   
34f40 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20   case 1: {.     
34f50 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66 66 30   xyz = 0x7fffff0
34f60 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78 79 7a  0 - i;.      xyz
34f70 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20 20 20   += 0x100;.     
34f80 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
34f90 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
34fa0 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b 0a 20  wIntObj(xyz));. 
34fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34fc0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a  }.    case 2: {.
34fd0 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35 3b 0a        w[1] = 5;.
34fe0 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d 3e 30        if( w[i]>0
34ff0 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20 20 20   ) w[1]++;.     
35000 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
35010 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
35020 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29 3b 0a  wIntObj(w[1]));.
35030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35040 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
35050 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c 6c 6f  .      a = mallo
35060 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 31  c( sizeof(int)*1
35070 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 );.      for(j
35080 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29 20 61  =0; j<10; j++) a
35090 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 66  [j] = j;.      f
350a0 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 54 63  ree(a);.      Tc
350b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
350c0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
350d0 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20 20 20  tObj(a[i]));.   
350e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
350f0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
35100 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28 22 44      Tcl_Panic("D
35110 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69 63 22  eliberate panic"
35120 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
35130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
35140 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a  rn TCL_OK;.}  ..
35150 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
35160 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f  register_dbstat_
35170 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  vtab DB.**.** Ca
35180 75 73 65 20 74 68 65 20 64 62 73 74 61 74 20 76  use the dbstat v
35190 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f 20  irtual table to 
351a0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  be available on 
351b0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 44  the connection D
351c0 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
351d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
351e0 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74  st_register_dbst
351f0 61 74 5f 76 74 61 62 28 0a 20 20 76 6f 69 64 20  at_vtab(.  void 
35200 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
35210 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
35220 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
35230 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
35240 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66  objv[].){.#ifdef
35250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
35260 54 55 41 4c 54 41 42 4c 45 0a 20 20 54 63 6c 5f  TUALTABLE.  Tcl_
35270 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
35280 65 72 70 2c 20 22 64 62 73 74 61 74 20 6e 6f 74  erp, "dbstat not
35290 20 61 76 61 69 6c 61 62 6c 65 20 62 65 63 61 75   available becau
352a0 73 65 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  se of ".        
352b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352c0 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49 54 5f     "SQLITE_OMIT_
352d0 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c 20 28  VIRTUALTABLE", (
352e0 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75  void*)0);.  retu
352f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
35300 6c 73 65 0a 20 20 73 74 72 75 63 74 20 53 71 6c  lse.  struct Sql
35310 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65 33 20  iteDb { sqlite3 
35320 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61 72 20 2a  *db; };.  char *
35330 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  zDb;.  Tcl_CmdIn
35340 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20 20 69  fo cmdInfo;..  i
35350 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
35360 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
35370 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
35380 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    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 0a 20 20 7a 44 62 20 3d 20 54 63  .  }..  zDb = Tc
353b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
353c0 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [1]);.  if( Tcl_
353d0 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
353e0 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
353f0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 73 71 6c  Info) ){.    sql
35400 69 74 65 33 2a 20 64 62 20 3d 20 28 28 73 74 72  ite3* db = ((str
35410 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
35420 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
35430 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20 20 73 71  ata)->db;.    sq
35440 6c 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73  lite3DbstatRegis
35450 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ter(db);.  }.  r
35460 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65  eturn TCL_OK;.#e
35470 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
35480 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35490 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c   */.}../*.** tcl
354a0 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 64  cmd:   sqlite3_d
354b0 62 5f 63 6f 6e 66 69 67 20 44 42 20 53 45 54 54  b_config DB SETT
354c0 49 4e 47 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  ING VALUE.**.** 
354d0 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64  Invoke sqlite3_d
354e0 62 5f 63 6f 6e 66 69 67 28 29 20 66 6f 72 20 6f  b_config() for o
354f0 6e 65 20 6f 66 20 74 68 65 20 73 65 74 74 69 6e  ne of the settin
35500 67 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  g values..*/.sta
35510 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
35520 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 69 74  CLAPI test_sqlit
35530 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a 20 20  e3_db_config(.  
35540 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
35550 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
35560 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
35570 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
35580 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
35590 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
355a0 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
355b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
355c0 20 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20 7d 20    int eVal;.  } 
355d0 61 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b 0a 20  aSetting[] = {. 
355e0 20 20 20 7b 20 22 46 4b 45 59 22 2c 20 20 20 20     { "FKEY",    
355f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
35600 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
35610 45 5f 46 4b 45 59 20 7d 2c 0a 20 20 20 20 7b 20  E_FKEY },.    { 
35620 22 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  "TRIGGER",      
35630 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
35640 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49  ONFIG_ENABLE_TRI
35650 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 46  GGER },.    { "F
35660 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22 2c 20  TS3_TOKENIZER", 
35670 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
35680 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
35690 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20  TOKENIZER },.   
356a0 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49   { "LOAD_EXTENSI
356b0 4f 4e 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ON",     SQLITE_
356c0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
356d0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d  LOAD_EXTENSION }
356e0 2c 0a 20 20 20 20 7b 20 22 4e 4f 5f 43 4b 50 54  ,.    { "NO_CKPT
356f0 5f 4f 4e 5f 43 4c 4f 53 45 22 2c 20 20 20 53 51  _ON_CLOSE",   SQ
35700 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f  LITE_DBCONFIG_NO
35710 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20 7d  _CKPT_ON_CLOSE }
35720 2c 0a 20 20 20 20 7b 20 22 51 50 53 47 22 2c 20  ,.    { "QPSG", 
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
35740 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
35750 41 42 4c 45 5f 51 50 53 47 20 7d 2c 0a 20 20 20  ABLE_QPSG },.   
35760 20 7b 20 22 54 52 49 47 47 45 52 5f 45 51 50 22   { "TRIGGER_EQP"
35770 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
35780 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
35790 5f 45 51 50 20 7d 2c 0a 20 20 20 20 7b 20 22 52  _EQP },.    { "R
357a0 45 53 45 54 5f 44 42 22 2c 20 20 20 20 20 20 20  ESET_DB",       
357b0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
357c0 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41  FIG_RESET_DATABA
357d0 53 45 20 7d 2c 0a 20 20 20 20 7b 20 22 44 45 46  SE },.    { "DEF
357e0 45 4e 53 49 56 45 22 2c 20 20 20 20 20 20 20 20  ENSIVE",        
357f0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
35800 47 5f 44 45 46 45 4e 53 49 56 45 20 7d 2c 0a 20  G_DEFENSIVE },. 
35810 20 20 20 7b 20 22 57 52 49 54 41 42 4c 45 5f 53     { "WRITABLE_S
35820 43 48 45 4d 41 22 2c 20 20 20 20 53 51 4c 49 54  CHEMA",    SQLIT
35830 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
35840 42 4c 45 5f 53 43 48 45 4d 41 20 7d 2c 0a 20 20  BLE_SCHEMA },.  
35850 20 20 7b 20 22 4c 45 47 41 43 59 5f 41 4c 54 45    { "LEGACY_ALTE
35860 52 5f 54 41 42 4c 45 22 2c 20 53 51 4c 49 54 45  R_TABLE", SQLITE
35870 5f 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59  _DBCONFIG_LEGACY
35880 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 7d 2c 0a  _ALTER_TABLE },.
35890 20 20 20 20 7b 20 22 44 51 53 5f 44 4d 4c 22 2c      { "DQS_DML",
358a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
358b0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f  TE_DBCONFIG_DQS_
358c0 44 4d 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 44 51  DML },.    { "DQ
358d0 53 5f 44 44 4c 22 2c 20 20 20 20 20 20 20 20 20  S_DDL",         
358e0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
358f0 49 47 5f 44 51 53 5f 44 44 4c 20 7d 2c 0a 20 20  IG_DQS_DDL },.  
35900 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  };.  int i;.  in
35910 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t v;.  const cha
35920 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73  r *zSetting;.  s
35930 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
35940 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
35950 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
35960 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
35970 6a 76 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20  jv, "DB SETTING 
35980 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74  VALUE");.    ret
35990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
359a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
359b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
359c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
359d0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
359e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
359f0 20 7a 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f   zSetting = Tcl_
35a00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
35a10 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ]);.  if( sqlite
35a20 33 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54  3_strglob("SQLIT
35a30 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  E_*", zSetting)=
35a40 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
35a50 20 37 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   7;.  if( sqlite
35a60 33 5f 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e  3_strglob("DBCON
35a70 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  FIG_*", zSetting
35a80 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
35a90 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69  += 9;.  if( sqli
35aa0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41  te3_strglob("ENA
35ab0 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  BLE_*", zSetting
35ac0 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
35ad0 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  += 7;.  for(i=0;
35ae0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65   i<ArraySize(aSe
35af0 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20  tting); i++){.  
35b00 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65    if( strcmp(zSe
35b10 74 74 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b  tting, aSetting[
35b20 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
35b30 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
35b40 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65  i>=ArraySize(aSe
35b50 74 74 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63  tting) ){.    Tc
35b60 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
35b70 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c  nterp,.      Tcl
35b80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75  _NewStringObj("u
35b90 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64  nknown sqlite3_d
35ba0 62 5f 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67  b_config setting
35bb0 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ", -1));.    ret
35bc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
35bd0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
35be0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
35bf0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20  p, objv[3], &v) 
35c00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
35c10 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62  OR;.  sqlite3_db
35c20 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74  _config(db, aSet
35c30 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c  ting[i].eVal, v,
35c40 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   &v);.  Tcl_SetO
35c50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
35c60 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
35c70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
35c80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
35c90 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  ange the name of
35ca0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
35cb0 73 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 22  se schema from "
35cc0 6d 61 69 6e 22 20 74 6f 20 22 69 63 65 63 75 62  main" to "icecub
35cd0 65 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e"..*/.static in
35ce0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
35cf0 74 65 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d 61  test_dbconfig_ma
35d00 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65  indbname_icecube
35d10 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
35d20 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
35d30 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
35d40 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
35d50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
35d60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
35d70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 65  sqlite3 *db;.  e
35d80 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50  xtern int getDbP
35d90 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72  ointer(Tcl_Inter
35da0 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  p*, const char*,
35db0 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 69   sqlite3**);.  i
35dc0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
35dd0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
35de0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
35df0 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
35e00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
35e10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
35e20 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
35e30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
35e40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
35e50 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
35e60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d  _ERROR;.    rc =
35e70 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
35e80 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
35e90 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
35ea0 45 2c 20 22 69 63 65 63 75 62 65 22 29 3b 0a 20  E, "icecube");. 
35eb0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
35ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
35ed0 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
35ee0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
35ef0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
35f00 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 77  Usage: sqlite3_w
35f10 61 6c 5f 69 6e 66 6f 20 44 42 20 44 42 4e 41 4d  al_info DB DBNAM
35f20 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
35f30 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
35f40 73 74 5f 77 61 6c 5f 69 6e 66 6f 28 0a 20 20 76  st_wal_info(.  v
35f50 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
35f60 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
35f70 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
35f80 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
35f90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
35fa0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
35fb0 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
35fc0 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e 65  zName;.  unsigne
35fd0 64 20 69 6e 74 20 6e 50 72 69 6f 72 3b 0a 20 20  d int nPrior;.  
35fe0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 46 72  unsigned int nFr
35ff0 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ame;..  if( objc
36000 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
36010 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
36020 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
36030 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
36040 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
36050 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
36060 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
36070 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
36080 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
36090 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
360a0 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
360b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
360c0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
360d0 65 33 5f 77 61 6c 5f 69 6e 66 6f 28 64 62 2c 20  e3_wal_info(db, 
360e0 7a 4e 61 6d 65 2c 20 26 6e 50 72 69 6f 72 2c 20  zName, &nPrior, 
360f0 26 6e 46 72 61 6d 65 29 3b 0a 20 20 69 66 28 20  &nFrame);.  if( 
36100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36110 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
36120 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
36130 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
36140 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
36150 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ), -1));.    ret
36160 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
36170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
36180 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f  Obj *pNew = Tcl_
36190 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63  NewObj();.    Tc
361a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
361b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
361c0 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  New, Tcl_NewWide
361d0 49 6e 74 4f 62 6a 28 28 69 36 34 29 6e 50 72 69  IntObj((i64)nPri
361e0 6f 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  or));.    Tcl_Li
361f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
36200 6e 74 28 69 6e 74 65 72 70 2c 20 70 4e 65 77 2c  nt(interp, pNew,
36210 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
36220 62 6a 28 28 69 36 34 29 6e 46 72 61 6d 65 29 29  bj((i64)nFrame))
36230 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
36240 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
36250 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
36260 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
36270 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
36280 65 33 5f 6d 6d 61 70 5f 77 61 72 6d 20 44 42 20  e3_mmap_warm DB 
36290 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  DBNAME.*/.static
362a0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
362b0 50 49 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72  PI test_mmap_war
362c0 6d 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  m(.  void * clie
362d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
362e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
362f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
36300 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
36310 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ].){.  extern in
36320 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54  t getDbPointer(T
36330 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73  cl_Interp*, cons
36340 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33  t char*, sqlite3
36350 2a 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  **);.  extern in
36360 74 20 73 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77  t sqlite3_mmap_w
36370 61 72 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  arm(sqlite3 *db,
36380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a   const char *);.
36390 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26  .  if( objc!=2 &
363a0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
363b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
363c0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
363d0 76 2c 20 22 44 42 20 3f 44 42 4e 41 4d 45 3f 22  v, "DB ?DBNAME?"
363e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
363f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
36400 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
36410 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
36420 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
36430 44 62 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  Db = 0;.    if( 
36440 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
36450 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
36460 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
36470 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
36480 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 6f 62  RROR;.    if( ob
36490 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
364a0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
364b0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
364c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
364d0 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d 28 64 62  te3_mmap_warm(db
364e0 2c 20 7a 44 62 29 3b 0a 20 20 20 20 54 63 6c 5f  , zDb);.    Tcl_
364f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
36500 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
36510 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
36520 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
36530 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
36540 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
36550 55 73 61 67 65 3a 20 20 64 65 63 6f 64 65 5f 68  Usage:  decode_h
36560 65 78 64 62 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20  exdb TEXT.**.** 
36570 45 78 61 6d 70 6c 65 3a 20 20 20 64 62 20 64 65  Example:   db de
36580 73 65 72 69 61 6c 69 7a 65 20 5b 64 65 63 6f 64  serialize [decod
36590 65 5f 68 65 78 64 62 20 24 6f 75 74 70 75 74 5f  e_hexdb $output_
365a0 6f 66 5f 64 62 74 6f 74 78 74 5d 0a 2a 2a 0a 2a  of_dbtotxt].**.*
365b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
365c0 65 74 75 72 6e 73 20 61 20 62 79 74 65 2d 61 72  eturns a byte-ar
365d0 72 61 79 20 66 6f 72 20 61 6e 20 53 51 4c 69 74  ray for an SQLit
365e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
365f0 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  that.** is const
36600 72 75 63 74 65 64 20 66 72 6f 6d 20 61 20 74 65  ructed from a te
36610 78 74 20 69 6e 70 75 74 20 77 68 69 63 68 20 69  xt input which i
36620 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  s the output of 
36630 74 68 65 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a  the "dbtotxt".**
36640 20 75 74 69 6c 69 74 79 2e 0a 2a 2f 0a 73 74 61   utility..*/.sta
36650 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
36660 43 4c 41 50 49 20 74 65 73 74 5f 64 65 63 6f 64  CLAPI test_decod
36670 65 5f 68 65 78 64 62 28 0a 20 20 76 6f 69 64 20  e_hexdb(.  void 
36680 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
36690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
366a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
366b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
366c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
366d0 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 30  st char *zIn = 0
366e0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
366f0 72 20 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  r *a = 0;.  int 
36700 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e  n = 0;.  int lin
36710 65 6e 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  eno = 0;.  int i
36720 2c 20 69 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69  , iNext;.  int i
36730 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e  Offset = 0;.  in
36740 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63  t j, k;.  int rc
36750 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
36760 20 78 5b 31 36 5d 3b 0a 20 20 69 66 28 20 6f 62   x[16];.  if( ob
36770 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
36780 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
36790 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
367a0 48 45 58 44 42 22 29 3b 0a 20 20 20 20 72 65 74  HEXDB");.    ret
367b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
367c0 20 7d 0a 20 20 7a 49 6e 20 3d 20 54 63 6c 5f 47   }.  zIn = Tcl_G
367d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
367e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49  );.  for(i=0; zI
367f0 6e 5b 69 5d 3b 20 69 3d 69 4e 65 78 74 29 7b 0a  n[i]; i=iNext){.
36800 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
36810 20 20 66 6f 72 28 69 4e 65 78 74 3d 69 3b 20 7a    for(iNext=i; z
36820 49 6e 5b 69 4e 65 78 74 5d 20 26 26 20 7a 49 6e  In[iNext] && zIn
36830 5b 69 4e 65 78 74 5d 21 3d 27 5c 6e 27 3b 20 69  [iNext]!='\n'; i
36840 4e 65 78 74 2b 2b 29 7b 7d 0a 20 20 20 20 69 66  Next++){}.    if
36850 28 20 7a 49 6e 5b 69 4e 65 78 74 5d 3d 3d 27 5c  ( zIn[iNext]=='\
36860 6e 27 20 29 20 69 4e 65 78 74 2b 2b 3b 0a 20 20  n' ) iNext++;.  
36870 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 69 5d 3d    while( zIn[i]=
36880 3d 27 20 27 20 7c 7c 20 7a 49 6e 5b 69 5d 3d 3d  =' ' || zIn[i]==
36890 27 5c 74 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  '\t' ){ i++; }. 
368a0 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
368b0 20 20 20 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20       int pgsz;. 
368c0 20 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66       rc = sscanf
368d0 28 7a 49 6e 2b 69 2c 20 22 7c 20 73 69 7a 65 20  (zIn+i, "| size 
368e0 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c  %d pagesize %d",
368f0 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 20   &n, &pgsz);.   
36900 20 20 20 69 66 28 20 72 63 21 3d 32 20 29 20 63     if( rc!=2 ) c
36910 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
36920 66 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70  f( pgsz<512 || p
36930 67 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67  gsz>65536 || (pg
36940 73 7a 26 28 70 67 73 7a 2d 31 29 29 21 3d 30 20  sz&(pgsz-1))!=0 
36950 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
36960 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
36970 72 70 2c 20 22 62 61 64 20 27 70 61 67 65 73 69  rp, "bad 'pagesi
36980 7a 65 27 20 66 69 65 6c 64 22 2c 20 28 76 6f 69  ze' field", (voi
36990 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72  d*)0);.        r
369a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
369b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
369c0 20 3d 20 28 6e 2b 70 67 73 7a 2d 31 29 26 7e 28   = (n+pgsz-1)&~(
369d0 70 67 73 7a 2d 31 29 3b 20 20 2f 2a 20 52 6f 75  pgsz-1);  /* Rou
369e0 6e 64 20 6e 20 75 70 20 74 6f 20 74 68 65 20 6e  nd n up to the n
369f0 65 78 74 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ext multiple of 
36a00 70 67 73 7a 20 2a 2f 0a 20 20 20 20 20 20 69 66  pgsz */.      if
36a10 28 20 6e 3c 35 31 32 20 29 7b 0a 20 20 20 20 20  ( n<512 ){.     
36a20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
36a30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
36a40 20 27 73 69 7a 65 27 20 66 69 65 6c 64 22 2c 20   'size' field", 
36a50 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20  (void*)0);.     
36a60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
36a70 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
36a80 20 20 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e     a = malloc( n
36a90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 3d   );.      if( a=
36aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =0 ){.        Tc
36ab0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36ac0 6e 74 65 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d  nterp, "out of m
36ad0 65 6d 6f 72 79 22 2c 20 28 76 6f 69 64 2a 29 30  emory", (void*)0
36ae0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
36af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
36b00 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
36b10 74 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  t(a, 0, n);.    
36b20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
36b30 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e  }.    rc = sscan
36b40 66 28 7a 49 6e 2b 69 2c 20 22 7c 20 70 61 67 65  f(zIn+i, "| page
36b50 20 25 64 20 6f 66 66 73 65 74 20 25 64 22 2c 20   %d offset %d", 
36b60 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20 69 66 28  &j, &k);.    if(
36b70 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20   rc==2 ){.      
36b80 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20  iOffset = k;.   
36b90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
36ba0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61   }.    rc = ssca
36bb0 6e 66 28 7a 49 6e 2b 69 2c 22 7c 20 25 64 3a 20  nf(zIn+i,"| %d: 
36bc0 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
36bd0 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
36be0 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 22   %x %x %x %x %x"
36bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36c00 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b    &j, &x[0], &x[
36c10 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d  1], &x[2], &x[3]
36c20 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20  , &x[4], &x[5], 
36c30 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20  &x[6], &x[7],.  
36c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78                &x
36c50 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31  [8], &x[9], &x[1
36c60 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31  0], &x[11], &x[1
36c70 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31  2], &x[13], &x[1
36c80 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20  4], &x[15]);.   
36c90 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20   if( rc==17 ){. 
36ca0 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74       k = iOffset
36cb0 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b  +j;.      if( k+
36cc0 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  16<=n ){.       
36cd0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
36ce0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36   for(ii=0; ii<16
36cf0 3b 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20  ; ii++) a[k+ii] 
36d00 3d 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20  = x[ii]&0xff;.  
36d10 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
36d20 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  inue;.    }.  }.
36d30 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
36d40 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
36d50 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 61  ewByteArrayObj(a
36d60 2c 20 6e 29 29 3b 0a 20 20 66 72 65 65 28 61 29  , n));.  free(a)
36d70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
36d80 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  K;.}.../*.** Reg
36d90 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77  ister commands w
36da0 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65  ith the TCL inte
36db0 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rpreter..*/.int 
36dc0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
36dd0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
36de0 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69  erp){.  extern i
36df0 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
36e00 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  h_count;.  exter
36e10 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f  n int sqlite3_fo
36e20 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  und_count;.  ext
36e30 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
36e40 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
36e50 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
36e60 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
36e70 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
36e80 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
36e90 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
36ea0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
36eb0 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53  rent_time;.#if S
36ec0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
36ed0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36ee0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
36ef0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36f00 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  LE.  extern int 
36f10 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
36f20 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74  um;.#endif.  ext
36f30 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
36f40 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20  max_blobsize;.  
36f50 65 78 74 65 72 6e 20 69 6e 74 20 53 51 4c 49 54  extern int SQLIT
36f60 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33  E_TCLAPI sqlite3
36f70 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65  BtreeSharedCache
36f80 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20  Report(void*,.  
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fb0 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65          Tcl_Inte
36fc0 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a  rp*,int,Tcl_Obj*
36fd0 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69  CONST*);.  stati
36fe0 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20 30 3b  c int iZero = 0;
36ff0 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
37000 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
37010 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d  ame;.     Tcl_Cm
37020 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
37030 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  } aCmd[] = {.   
37040 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c 20    { "db_enter", 
37050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37060 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37070 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20 20  c*)db_enter     
37080 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
37090 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c 20    { "db_leave", 
370a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370b0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
370c0 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20 20  c*)db_leave     
370d0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
370e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
370f0 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20  intf_int",      
37100 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37110 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
37120 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20  tf_int    },.   
37130 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
37140 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20 20  intf_int64",    
37150 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37160 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
37170 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20  tf_int64  },.   
37180 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
37190 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20 20  intf_long",     
371a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
371b0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
371c0 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20 20  tf_long   },.   
371d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
371e0 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20  intf_str",      
371f0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37200 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
37210 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20 20  tf_str    },.   
37220 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70    { "sqlite3_snp
37230 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20  rintf_str",     
37240 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37250 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  c*)sqlite3_snpri
37260 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20  ntf_str   },.   
37270 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
37280 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20  intf_stronly",  
37290 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
372a0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
372b0 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20  tf_stronly},.   
372c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
372d0 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20  intf_double",   
372e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
372f0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
37300 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20  tf_double },.   
37310 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
37320 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20 20  intf_scaled",   
37330 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37340 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
37350 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20  tf_scaled },.   
37360 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
37370 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c  intf_hexdouble",
37380 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
37390 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  )sqlite3_mprintf
373a0 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20  _hexdouble},.   
373b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
373c0 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20  intf_z_test",   
373d0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
373e0 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  c*)test_mprintf_
373f0 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  z        },.    
37400 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
37410 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20  ntf_n_test",    
37420 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
37430 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e  *)test_mprintf_n
37440 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
37450 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  { "sqlite3_snpri
37460 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ntf_int",       
37470 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
37480 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69  )test_snprintf_i
37490 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  nt     },.     {
374a0 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69   "sqlite3_last_i
374b0 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 20  nsert_rowid",   
374c0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
374d0 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20  test_last_rowid 
374e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
374f0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72  "sqlite3_exec_pr
37500 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20  intf",          
37510 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
37520 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 20  est_exec_printf 
37530 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
37540 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78  sqlite3_exec_hex
37550 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37560 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
37570 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20 20  st_exec_hex     
37580 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
37590 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20 20  qlite3_exec",   
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
375b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
375c0 74 5f 65 78 65 63 20 20 20 20 20 20 20 20 20 20  t_exec          
375d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
375e0 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20  lite3_exec_nr", 
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
37600 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
37610 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20 20  _exec_nr        
37620 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
37630 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42  ITE_OMIT_GET_TAB
37640 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  LE.     { "sqlit
37650 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
37660 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c 5f  ntf",      (Tcl_
37670 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67 65  CmdProc*)test_ge
37680 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d  t_table_printf }
37690 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
376a0 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c  "sqlite3_close",
376b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376c0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
376d0 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
376e0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
376f0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
37700 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37710 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
37720 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f  lite_test_close_
37730 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  v2  },.     { "s
37740 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
37750 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28  nction",       (
37760 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
37770 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
37780 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  n  },.     { "sq
37790 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
377a0 72 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54  regate",      (T
377b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
377c0 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
377d0 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
377e0 69 74 65 33 5f 64 72 6f 70 5f 6d 6f 64 75 6c 65  ite3_drop_module
377f0 73 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  s",          (Tc
37800 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
37810 64 72 6f 70 5f 6d 6f 64 75 6c 65 73 20 20 20 20  drop_modules    
37820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37830 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
37840 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c  _function", (Tcl
37850 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
37860 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20  egister_func    
37870 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
37880 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20  e_abort",       
37890 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
378a0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
378b0 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d  abort          }
378c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
378d0 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
378e0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
378f0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
37900 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
37910 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
37920 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
37930 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
37940 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
37950 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
37960 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37970 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
37980 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
37990 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
379a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
379b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
379c0 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
379d0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
379e0 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
379f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
37a00 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
37a10 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
37a20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
37a30 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
37a40 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20  agic      },.   
37a50 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74    { "sqlite3_int
37a60 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
37a70 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37a80 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70  c*)test_interrup
37a90 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
37aa0 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
37ab0 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
37ac0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
37ad0 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  *)delete_functio
37ae0 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  n       },.     
37af0 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  { "sqlite_delete
37b00 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20  _collation",    
37b10 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
37b20 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  )delete_collatio
37b30 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  n      },.     {
37b40 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   "sqlite3_get_au
37b50 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  tocommit",      
37b60 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
37b70 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20  get_autocommit  
37b80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
37b90 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69  "sqlite3_busy_ti
37ba0 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20  meout",         
37bb0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
37bc0 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
37bd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
37be0 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
37bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c00 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
37c10 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20  st_printf       
37c20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
37c30 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20  qlite3IoTrace", 
37c40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
37c50 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
37c60 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20 20  io_trace        
37c70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c 61 6e   },.     { "clan
37c80 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
37c90 73 73 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ss",        (Tcl
37ca0 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e 67 5f  _CmdProc*)clang_
37cb0 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
37cc0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69   },.  };.  stati
37cd0 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
37ce0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
37cf0 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63    Tcl_ObjCmdProc
37d00 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f   *xProc;.     vo
37d10 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id *clientData;.
37d20 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20    } aObjCmd[] = 
37d30 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
37d40 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c 20 20 20  3_db_config",   
37d50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
37d60 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
37d70 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62  , 0 },.     { "b
37d80 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20 20 20  ad_behavior",   
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
37da0 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72  est_bad_behavior
37db0 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65 72 6f  ,  (void*)&iZero
37dc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 67 69   },.     { "regi
37dd0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
37de0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
37df0 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74  _register_dbstat
37e00 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20 20 7b  _vtab  },.     {
37e10 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   "sqlite3_connec
37e20 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20  tion_pointer",  
37e30 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69    get_sqlite_poi
37e40 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  nter, 0 },.     
37e50 7b 20 22 69 6e 74 61 72 72 61 79 5f 61 64 64 72  { "intarray_addr
37e60 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37e70 20 20 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79     test_intarray
37e80 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20  _addr, 0 },.    
37e90 20 7b 20 22 69 6e 74 36 34 61 72 72 61 79 5f 61   { "int64array_a
37ea0 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ddr",           
37eb0 20 20 20 20 74 65 73 74 5f 69 6e 74 36 34 61 72      test_int64ar
37ec0 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20  ray_addr, 0 },. 
37ed0 20 20 20 20 7b 20 22 64 6f 75 62 6c 65 61 72 72      { "doublearr
37ee0 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20  ay_addr",       
37ef0 20 20 20 20 20 20 20 74 65 73 74 5f 64 6f 75 62         test_doub
37f00 6c 65 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20  learray_addr, 0 
37f10 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 61  },.     { "texta
37f20 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
37f30 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
37f40 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 2c 20  textarray_addr, 
37f50 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37f60 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20  ite3_bind_int", 
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
37f80 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20  t_bind_int,     
37f90 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
37fa0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
37fb0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74 65  lob",         te
37fc0 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
37fd0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
37fe0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
37ff0 62 6c 6f 62 36 34 22 2c 20 20 20 20 20 20 20 74  blob64",       t
38000 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  est_bind_zeroblo
38010 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  b64, 0 },.     {
38020 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
38030 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
38040 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36    test_bind_int6
38050 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  4,    0 },.     
38060 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
38070 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
38080 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75     test_bind_dou
38090 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ble,   0 },.    
380a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
380b0 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  _null",         
380c0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75      test_bind_nu
380d0 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ll     ,0 },.   
380e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
380f0 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20  d_text",        
38100 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
38110 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ext     ,0 },.  
38120 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
38130 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20  nd_text16",     
38140 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
38150 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20  text16   ,0 },. 
38160 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
38170 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  ind_blob",      
38180 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
38190 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a  _blob     ,0 },.
381a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
381b0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
381c0 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e  ount",  test_bin
381d0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
381e0 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  t, 0},.     { "s
381f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
38200 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74  meter_name",   t
38210 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
38220 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20  er_name,  0},.  
38230 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
38240 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
38250 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  ex",  test_bind_
38260 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c  parameter_index,
38270 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
38280 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
38290 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73  ngs",        tes
382a0 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
382b0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
382c0 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
382e0 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
382f0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
38300 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcod